【问题标题】:Makefile: extract an env variable from a docker container and use it in another docker containerMakefile:从 docker 容器中提取环境变量并在另一个 docker 容器中使用它
【发布时间】:2019-05-09 03:58:49
【问题描述】:

我有一个在多个 docker 容器上运行的应用程序。为了简化我的问题,假设我有 3 个容器:一个用于 MySQL,2 个用于 2 个 api 实例(共享代码所在的同一卷,但使用不同的 env 指定不同的数据库设置),如以下 @987654322 中所配置@

services:
  api-1:
    image: mynamespace/my-image-name:1.0
    environment:
      DB_NAME: db_api_1
  api-2:
    image: mynamespace/my-image-name:1.0
    environment:
      DB_NAME: db_api_2

Makefile 中,我有为我的每个 api 实例部署容器和安装数据库的规则。

我想要实现的是创建一个make 规则,该规则在给定env 的情况下转储数据库。知道我的 api 实例上没有安装 MySQL 客户端,我认为应该有一种方法可以从 api 容器中提取我需要的 env 变量(使用 printenv VARNAME),然后在数据库容器中使用它。

有谁知道这是怎么做到的?

【问题讨论】:

  • 当你说 3 个容器是指 3 个独立的 docker 镜像?还是来自一个 docker 映像的 MySQL 容器和 2 个 API 实例是从同一个 docker 映像创建的两个容器?如何为 2 个 API 实例中的每一个指定不同的环境变量?
  • 它是来自 MySQL 映像的 1 个容器和来自同一映像但具有不同 env 的 2 个 API。我已经更新了我的问题

标签: docker makefile environment-variables


【解决方案1】:

假设它是您使用-e 选项设置为docker run 的环境变量,您可以执行以下操作:

docker exec api_container sh -c 'echo $VARNAME'

如果是在容器内设置的环境变量,例如从一个脚本,那么你大多不走运。你当然可以检查/proc/<pid>/environ,但那太老套了,我不推荐它。

听起来您也可以从使用 docker-compose 之类的东西来管理您的容器中受益。

【讨论】:

  • 我正在使用docker-compose,而您的解决方案无法在 Makefile 中工作,因为 'echo $VARNAME' 尝试读取空的 $V 并最终回显 ARNAME
  • 如果您试图引用 shell 变量,您需要在 Makefile 中转义 $echo $$VARNAME。请参阅Make docs 了解更多信息。
  • 好的太好了,谢谢我不知道美元符号是如何被转义的。所以现在我已经提取了变量(我已经用docker exec api_container printenv VARNAME 实现了这一点),有没有办法可以在针对database 容器的后续命令中使用该变量?
猜你喜欢
  • 2017-08-14
  • 2016-03-07
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2020-07-24
相关资源
最近更新 更多