【问题标题】:Dockerfile: reference previously defined ENV in another ENVDockerfile:在另一个 ENV 中引用之前定义的 ENV
【发布时间】:2020-06-24 16:27:37
【问题描述】:

我有一个 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 中使用之前设置的环境变量?

【问题讨论】:

    标签: docker environment-variables dockerfile


    【解决方案1】:

    为此,您需要分离变量并使用多行赋值。

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

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

    为了更清楚,在:

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

    z 将具有值 hello 而不是 world。

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

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      您可以重用之前设置在外部但不在ENV 内部设置的环境变量,因为同一ENV 中的所有语句都会获取在处理ENV 之前定义的值。所以你应该把它拆分成单独的ENVs。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-23
        • 2020-03-09
        • 2022-10-09
        • 2017-03-13
        • 2019-12-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多