在Dockerfile中的ENV指令中未设置$ PWD

时间:2017-06-09 08:25:17

标签: docker dockerfile

我有一个像这样的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"

我在运行$PWD时未设置${PWD}(或docker build),作为比较,$PATH已正确展开。

此外,$PWD中的RUN没有问题(在这种情况下打印/some/path

所以给定Dockerfile的输出是:

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

有人可以告诉我为什么$PWD如此特别吗?我想这可能与WORKDIR的行为有关,但我对此没有任何线索。

1 个答案:

答案 0 :(得分:6)

PWD是一个在shell中设置的特殊变量。当docker RUN使用这个表单sh -c 'something'执行某些操作时,从ENV指令传递预定义的环境变量,其中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"

docs中的更多信息:

  

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