Dockerfile中的ENV指令中没有设置$ PWD

我有一个Dockerfile开始是这样的:

FROM ubuntu:16.04 WORKDIR /some/path COPY . . ENV PYTHONUSERBASE=$PWD/pyenv PATH=$PWD/pyenv/bin:$PATH RUN echo "PWD is: $PWD" RUN echo "PYENV is: $PYTHONUSERBASE" 

当我运行docker build ,发现$PWD (或者${PWD} )没有被设置,作为比较, $PATH被正确地扩展了。

而且, RUN $PWD没有问题(这里打印/some/path

所以给定的Dockerfile的输出是:

 PWD is: /some/path PYENV is: /pyenv 

有人可以告诉我为什么$PWD是如此特别? 我想这可能与WORKDIR的行为有关,但我不知道这一点。

PWD是一个在shell中设置的特殊variables。 当docker运行一些它使用这种forms的sh -c 'something' ,从ENV指令中传递预定义的环境variables,其中PWD不在该列表中(参见docker inspect <image-id> )。

ENV指令不会启动一个shell。 只需添加或更新图像元数据中的env vars的当前列表。

我会这样写你的Dockerfile:

 FROM ubuntu:16.04 ENV APP_PATH=/some/path WORKDIR $APP_PATH COPY . . ENV PYTHONUSERBASE=$APP_PATH/pyenv PATH=$APP_PATH/pyenv/bin:$PATH RUN echo "PWD is: $PWD" RUN echo "PYENV is: $PYTHONUSERBASE" 

文档中的更多信息:

WORKDIR指令为Dockerfile中后面的RUN,CMD,ENTRYPOINT,COPY和ADD指令设置工作目录。 如果WORKDIR不存在,即使它不在任何后续的Dockerfile指令中使用,它也将被创build。