Dockerfile:在另一个 ENV 中引用先前定义的 ENV



我有一个Dockerfile,在其中设置了一些环境变量(用于运行容器时使用(。某些环境变量依赖于以前的环境变量。我想成为 DRY,避免在我可以替换变量时多次硬编码环境变量的值。

在这个简单的示例中,PYTHONPATH 环境变量使用来自PROJ_DIR环境变量的值。

FROM python:3.8.4
ENV PROJ_DIR=/myproj/ 
PYTHONPATH=${PROJ_DIR}:${PYTHONPATH}

但是,当我实际运行容器时,正确设置了PROJ_DIR,但不会设置因变量 PYTHONPATH。

docker build -f Dockerfile . -t test-docker
docker run --rm -it test-docker:latest bash 
root@60fc899899a1:/# export | grep -i proj
declare -x PROJ_DIR="/myproj/"
root@60fc899899a1:/# export | grep -i pythonpath
declare -x PYTHONPATH=":"

如何在 Dockerfile 中使用以前设置的环境变量?

要使其正常工作,您需要将变量带出并使用多行赋值。

ENV PROJ_DIR /myproj/
ENV PYTHONPATH ${PROJ_DIR}:${PYTHONPATH}

在整个指令中,环境变量替换将为每个变量使用相同的值。在您的情况下,PROJ_DIR尚未被赋值,因此它在 PYTHONPATH varaible 中返回空。

更清楚的是,在:

ENV x=hello
ENV x=world z=$x

z将有价值你,而不是世界

由于多行,不会创建任何附加层,因为 ENV 层确实会被压扁。

希望有帮助。

您可以重用以前在ENV外部设置但不在内设置的环境变量,因为同一语句中的所有语句ENV拾取在处理ENV之前定义的值。因此,您应该将其拆分为单独的ENV

ENV PROJ_DIR=/myproj/
ENV PYTHONPATH=${PROJ_DIR}:${PYTHONPATH}

最新更新