【问题标题】:Setting environment variables on docker before exec在 exec 之前在 docker 上设置环境变量
【发布时间】:2022-01-12 05:43:44
【问题描述】:

我在 ubuntu docker 上运行 set 组命令,我需要设置几个环境变量才能使我的脚本正常工作。

我尝试了几种替代方法,但似乎都没有解决我的问题。

备选方案 1:使用 --env 或 --env-file

在我已经运行的容器上,我运行:

docker exec -it --env TESTVAR="some_path" ai_pipeline_new_image bash -c "echo $TESTVAR"
docker exec -it --env-file env_vars ai_pipeline_new_image bash -c "echo $TESTVAR"

env_vars的内容:

TESTVAR="some_path"

在这两种情况下,输出都是空的。

备选方案 2:使用 dockerfile

我使用以下 docker 文件创建我的图像

FROM ai_pipeline_yh
ENV TESTVAR "A_PATH"

使用这种替代方法,如果我附加到 docker(也就是我运行交互式 shell),则设置变量,但如果我从主机运行 docker exec -it ai_pipeline_new_image bash -c "echo $TESTVAR",则输出为空白。

这样做的干净方法是什么?

编辑

事实证明,如果我从 shell 脚本中检查变量的状态,它们就会被设置,但如果直接在 bash -c "echo $VAR" 中检查它们则不会。我真的很想了解为什么会这样。我提供一个最小的例子:

运行泊坞窗

docker run -it --name ubuntu_env_vars ubuntu

创建一个回显 VAR 的文件(在容器内)

root@afdc8c494e8a:/# echo "echo \$VAR" > env_check.sh
root@afdc8c494e8a:/# chmod +x env_check.sh

从主机运行:

docker exec -it -e VAR=BLA ubuntu_env_vars bash -c "echo $VAR"

(空白输出)

从主机运行:

docker exec -it -e VAR=BLA ubuntu_env_vars bash -c "/env_check.sh"

输出:BLA

为什么???????

【问题讨论】:

  • #1 您是否需要将环境变量注入活动容器? #2 您是否可以选择重建图像并添加一些功能? #3 为什么-e foo=bar 参数对你不起作用?
  • #1 我不需要注入它们。在我第一次运行容器(或在 docker 文件中)时设置它们并在之后使用它们会很好。 #2 是的,#3 我不知道为什么它不起作用。也许我输入错误?

标签: linux docker environment-variables virtual-environment


【解决方案1】:

在运行时(应用程序启动)将您的应用程序设计为环境变量是一个不错的选择

不要在 docker build 阶段使用环境变量。

有时问题不是环境变量或docker,问题是读取环境变量的应用程序。

无论如何,您可以通过以下选项在运行时将环境变量注入 docker 容器:

-e foo=bar

这是最基本的方式:

docker run -it -e foo=bar ubuntu

这些变量将在您的容器启动时可用。

远程变量

如果需要传递多个变量,使用 -e 将不是最好的方法。

或者,如果您不想使用 .env 文件或任何带有变量的本地文件,您应该:

  • 准备您的应用以读取环境变量
  • 在 docker 入口点 bash 脚本中注入变量,从远程变量管理器中读取它
  • 在shell 脚本中,您将获得远程变量并使用source /foo/bar/variables 注入它们。样品here

通过这种方法,您将拥有一个适用于所有容器的变量管理器。这些变量管理器具有以下功能:

  • 登录
  • 创建应用程序
  • 通过应用程序创建变量
  • 如果两个或多个应用需要一个变量,则创建全局变量
  • 公开要在客户端(应用程序)中使用的 http 端点以获取变量
  • 地穴

您有以下选择:

如果您想使用这种方法来帮助您,请告诉我。

【讨论】:

  • 感谢您的回答。我尝试了您建议的(-e foo=bar),但请注意我没有运行交互式外壳。我正在使用docker exec 即使按照你的建议做,当我运行docker exec -it my_docker bash -c "echo $MYVAR" 时,输出是空白的。
  • -e 是为docker run 而不是docker exec。 docker exec 应该用于在生产前阶段调试容器,而不是在生产环境中。我建议 docker run -e 或我解释的自定义脚本
【解决方案2】:

我暴露了我的菜鸟。在这里回答我自己的问题:

--env-file file-env foo=bar 这两个选项都可以。

我在测试时忘记转义 $ 字符。因此,测试变量是否存在的正确命令是:

docker exec -it my_docker bash -c "echo \$MYVAR"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-11
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    相关资源
    最近更新 更多