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

我有一个像这样开始的 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 中设置的特殊变量。当 docker RUN 使用此表单sh -c 'something'执行此操作时,从 ENV 指令传递预定义的环境变量,其中 PWD 不在该列表中(参见docker inspect <image-id>)。

ENV 指令不会启动 shell。只需在图像元数据中添加或更新当前环境变量列表。

我会这样写你的 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 指令中使用,它也会被创建。

Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐