【问题标题】:Replace an ENV variable inside a .sh file替换 .sh 文件中的 ENV 变量
【发布时间】:2020-08-20 17:32:38
【问题描述】:

我有一个致命的疑问,我想替换在 docker 映像内的 .sh 文件中声明的环境变量。

有什么方法可以做到这一点而无需安装卷来更改它?

注意。我已经尝试通过 compose 做到这一点,并且我已经保证我的 set 变量在那里,但是它被 sh 文件中的原始声明覆盖了。

【问题讨论】:

  • 不幸的是,第一个答案建议使用环境,第二个建议复制文件,更改它然后返回内部。我一直在寻找一种解决方案,可以通过 compose 或通过一些 Dockerfile 直接执行任务。
  • 那么用替换的文件创建一个新图像?
  • 这就是问题所在,它是一个应用程序,我们无法更改图像,我们必须使其在本地工作,以便我们进行更改。
  • .sh文件是否运行在docker文件的ENTRYPOINTCMD语句中?

标签: docker docker-compose dockerfile devops


【解决方案1】:

我不明白这样做的原因。 ENV 在图像运行阶段获得准确值。如果您尝试使用不同的配置文件在 docker run 期间传递不同的 env 文件运行多个应用程序。 在 Dockerfile 中,您可以将参数传递给您的 shell 脚本:

CMD my_app.sh ${APP_ADDR} ${APP_PORT}

在 my_app.sh 中

获取类似的变量

APP_ADDR=$1
APP_PORT=$2

当您运行 docker 映像时,将所有变量存储在 env 文件中并像这样传递它:

docker run --env-file=app_local.env my_app:0.1

在 env 文件中你可以定义你的变量:

APP_ADDR=192.168.200.200
APP_PORT=5678
....

【讨论】:

  • 但这适用于以下情况:在图像内部我有一个已经定义变量的 sh,例如:URI=192.168.10.1:8080 我用 dockerfile 替换它?知道当您启动 sh 脚本时它会采用创建它的原始值吗?
  • 我不完全理解你最后的评论。我认为通常您必须修改所有 sh 脚本并从 cmd 参数中获取所有参数,并指定一个点(env 文件)来定义所有变量。在 dockerfile 中,您将所有参数传递给脚本。我认为在图像中维护您的应用程序会很容易。
  • 我会解释得更好。图像中已经存在一个 .sh 文件,它在入口点语句中运行,该文件已经在其中定义了一个变量值。我只想覆盖这个变量。
  • 我明白你想要什么。我只能建议您通过 export URI=192.168.10.1:8080 从另一个 sh 脚本覆盖变量。
【解决方案2】:

您可以按照here的建议进行操作

ENTRYPOINT ./base_image_entrypoint_script.sh && export URI=http://localhost

这样,您可以使用相同的脚本覆盖基本图像 ENTRYPOINT,但会添加您想要的 env car,它将覆盖脚本变量。

【讨论】:

    猜你喜欢
    • 2021-01-03
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2017-02-11
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多