我有一个像这样的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
的行为有关,但我对此没有任何线索。
答案 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指令中使用,也会创建它。