在执行docker命令之前设置环境变量

3

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

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

替代方案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

我使用以下Dockerfile创建我的镜像:

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
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”参数对你不起作用? - JRichardsz
#1 我不需要注入它们。第一次运行容器时(或在Docker文件中)设置它们并在之后使用就可以了。 #2 是的, #3 我不知道为什么它不起作用。也许我输入了一些错误的内容? - Sergio
2个回答

3

我展现了我的新手特质。在这里回答自己的问题:

两个选项,--env-file file 或者 -env foo=bar 都可以使用。

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

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


1

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

不要在Docker构建阶段使用环境变量。

有时问题不在于环境变量或Docker,而在于读取环境变量的应用程序本身。

无论如何,您都可以选择以下选项在运行时向Docker容器注入环境变量:

-e foo=bar

这是最基本的方法:

docker run -it -e foo=bar ubuntu

1

这些变量将从容器启动时开始可用。

远程变量

如果您需要传递多个变量,则使用 -e 不是最佳方式。

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

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

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

  • 登录
  • 创建应用程序
  • 按应用程序创建变量
  • 如果一个变量需要两个或更多应用程序,则创建全局变量
  • 公开 http 端点以供客户端(应用程序)使用,以获取变量
  • 加密
  • 等等

您有以下选项:

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


感谢您的回答。我尝试了您建议的“-e foo=bar”,但请注意,我没有运行交互式 shell。我正在使用“docker exec”。即使按照您的建议操作,当我运行“docker exec -it my_docker bash -c“echo $MYVAR””时,输出为空白。 - Sergio
“-e” 是用于 “docker run” 而不是 “docker exec”。在预生产阶段,应使用 docker exec 来调试容器,而不是在生产环境中。我建议使用 docker run -e 或自定义脚本,就像我所解释的那样。 - JRichardsz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接