【问题标题】:Dockerfile set environment variable with scriptDockerfile 使用脚本设置环境变量
【发布时间】:2020-10-14 18:20:56
【问题描述】:

我正在尝试通过脚本设置一些环境变量。 (就像这里解释的那样:https://stackoverflow.com/a/55922307

Dockerfile

   FROM container1:latest
   WORKDIR /etc/test
   RUN ["/bin/bash", "-c", ". env/environment.sh && command2 && command3"]
   COPY entry.sh .
   ENTRYPOINT ["/etc/test/entry.sh"]

entry.sh

#!/bin/bash
. /etc/test/env/environment.sh
exec "$@"

然后构建镜像:

docker build -t docker-test .

然后运行它:

docker run -it -d --name env-test docker-test:latest

但容器在几秒钟后停止:

COMMAND                 CREATED             STATUS
"/etc/test/entry.sh"   7 seconds ago       Exited (0) 1 second ago

为什么容器不再运行?我想和 docker exec 一起讨论。 我可以以某种方式测试环境变量是否设置正确?

我试图添加 CMD [ "sh", "-c", "echo $PATH" ] 添加结尾,但没有任何反应...

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:

    您的容器退出,因为您没有提供任何运行命令。您已将 ENTRYPOINT 设置为 /etc/test/entry.sh,并且该脚本会尝试执行您提供的任何参数(通过 exec "$@"),但您正在像这样运行图像:

    docker run -it -d --name env-test docker-test:latest
    

    由于您没有提供命令,因此容器一启动就会退出。添加 CMD [ "sh", "-c", "echo $PATH" ] 不会改变这种行为,因为 that 命令也会立即退出。

    不清楚你希望这个容器做什么。

    如果您只想让容器在其中停留一段时间,可以让它运行sleep 命令:

    docker run -it -d --name env-test docker-test:latest sleep 1800
    

    或者您可以将其作为默认命令烘焙到 Dockerfile 中:

    FROM container1:latest
    WORKDIR /etc/test
    RUN ["/bin/bash", "-c", ". env/environment.sh && command2 && command3"]
    COPY entry.sh .
    ENTRYPOINT ["/etc/test/entry.sh"]
    CMD ["sleep", "1800"]
    

    但是这些例子都没有真正的意义;您通常会让容器运行某种长期存在的进程,例如 Web 服务器、数据库等,而不是仅仅作为docker exec 的目标。

    【讨论】:

    • 谢谢,感谢您的回答。非常有帮助。所以如果我理解正确,如果 CMD 启动一个进程,容器不应该停止运行?
    • 只要您的ENTRYPOINTCMD 启动的最后一个进程没有退出或进入后台,容器就会继续运行。
    • 谢谢。同时,我发现 ENTRYPOINT 仅由 docker run 调用。运行 docker exec 时设置环境变量有没有好的解决方案?
    猜你喜欢
    • 2020-11-21
    • 2020-04-05
    • 2018-10-22
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多