【问题标题】:docker run script which exports env variablesdocker run 导出环境变量的脚本
【发布时间】:2019-04-25 08:24:27
【问题描述】:

我已经搜索了一些问题,例如 docker ENV vs RUN export,它解释了这些命令之间的差异,但对解决我的问题没有帮助。

例如我有一个名为myscript的脚本:

#!/bin/bash
export PLATFORM_HOME="$(pwd)"

并且在 Dockerfile 中有以下几行:

...
COPY myscript.sh /
RUN ./myscript.sh

我也尝试在调用脚本之前使用 ENTRYPOINT 而不是 RUN 或声明变量,但都没有成功。

我想要实现的是 PLATFORM_HOME 可以从其他使用该文件作为基础的 Dockerfile 中引用。怎么办?

【问题讨论】:

    标签: shell docker dockerfile


    【解决方案1】:

    无法将变量从脚本导出到子图像。作为一般规则,环境变量向下传播,从不向上传播。

    ENV 将持续存在于构建环境以及子映像和容器中。

    Dockerfile

    FROM busybox
    ENV PLATFORM_HOME test
    RUN echo $PLATFORM_HOME
    

    Dockerfile.child

    FROM me/platform
    RUN echo $PLATFORM_HOME
    CMD ["sh", "-c", "echo $PLATFORM_HOME"]
    

    构建父级

    docker build -t me/platform .
    

    然后构建孩子:

    → docker build -f Dockerfile.child -t me/platform-test  .
    Sending build context to Docker daemon  3.072kB
    Step 1/3 : FROM me/platform
     ---> 539b52190af4
    Step 2/3 : RUN echo $PLATFORM_HOME
     ---> Using cache
     ---> 40e0bfa872ed
    Step 3/3 : CMD sh -c echo $PLATFORM_HOME
     ---> Using cache
     ---> 0c0e842f99fd
    Successfully built 0c0e842f99fd
    Successfully tagged me/platform-test:latest
    

    然后运行

    → docker run --rm me/platform-test
    test
    

    【讨论】:

    • +1 措辞稍有不同,Dockerfile 中的RUN 执行命令,并在该命令退出时,文件系统更改将保留在正在创建的映像的层中。对环境、衍生的守护进程等的更改不会在映像中捕获。
    【解决方案2】:

    我认为 export 为子进程设置了环境变量。因此,执行 RUN 或 ENTRYPOINT 并不重要。在阅读linux source command not working when building Dockerfile的过程中,我觉得source命令也无济于事。

    如果要在 Dockerfile 中设置环境变量,则需要使用 ENV。

    【讨论】:

    • 所以据我所知,现在这是不可能的,对吧?
    【解决方案3】:

    只需在 Dockerfile 中使用 ENV PLATFORM_HOME=$(pwd)。您将从 Dockerfile 创建的每个容器中都可以访问变量。

    【讨论】:

    • 好吧,问题是关于从脚本中导出它。我不能将它用作 ENV,因为这个脚本不是我的
    猜你喜欢
    • 1970-01-01
    • 2018-04-29
    • 2017-01-22
    • 2021-06-25
    • 2020-07-20
    • 2023-03-03
    • 2016-03-01
    • 1970-01-01
    • 2018-04-13
    相关资源
    最近更新 更多