我有一个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}