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。