Docker 链接容器作为构建参数

Posted

技术标签:

【中文标题】Docker 链接容器作为构建参数【英文标题】:Docker link container as build argument 【发布时间】:2017-01-11 15:03:04 【问题描述】:

我有一个 Docker 作曲家文件,类似于:

版本:'2' 服务: D b: 图片:mariadb:10.1 卷: - “./.data/db:/var/lib/mysql” 重启:总是 环境: MYSQL_ROOT_PASSWORD:测试 MYSQL_DATABASE:测试 MYSQL_USER:测试 MYSQL_PASSWORD:测试 测试: 取决于: - D b 链接: -分贝:分贝 建造: 语境: 。 参数: MYSQL_HOST:分贝 MYSQL_DATABASE:测试 MYSQL_USER:测试 MYSQL_PASSWORD:测试 端口: - “8000:80” 重启:总是

测试容器Dockerfile内部

从 ... ... ARG MYSQL_HOST 127.0.0.1 运行设置-x;回声 $MYSQL_HOST 运行脚本 ... --param $MYSQL_HOST

但是 MYSQL_HOST 变量(我希望它是另一个容器的内部 IP)没有被转换为另一个容器名称。

怎么可能呢?可以用 docker-compose 用另一种方式实现吗?

【问题讨论】:

MYSQL_HOST 包含什么值? MYSQL_HOST 应该引用另一个容器的主机名/IP... 好的,但是现在包含什么,与您当前的作曲家文件有关? 上面可以看到:
 ... args: MYSQL_HOST: db 
【参考方案1】:

我认为您不希望在此处使用构建参数。可能会将 MYSQL_HOST 设置为环境变量。在 docker-compose 内部,文字字符串 db 实际上可以解析到您的数据库容器。

通常,撰写文件如下所示:

test:
   links:
     db:db
   environment:
     - MYSQL_HOST=db

然后在您的测试代码中执行以下操作:

...
String dbHost = System.getEnv("MYSQL_HOST");
...

这样,MySql 主机不需要内置到您的镜像中,从而无需一直重建您的镜像。

【讨论】:

感谢您的建议。遗憾的是,该代码已在现有应用程序中,它实际上用于生成配置文件以供正在运行的应用程序读取(此代码:mediawiki.org/wiki/Manual:Install.php)。似乎它必须与构建参数一起使用,因为在构建过程中忽略了环境。 听起来你的构建依赖于外部网络对另一个容器的访问。按照设计,镜像应该能够在没有外部依赖的任何 docker 主机上构建,并且 docker 并不真正支持您收集依赖项所需的方法。充其量,您可以有一个预构建步骤,从外部来源收集设置并将这些设置作为参数直接注入到图像构建中。 谢谢。你说得对。实际上,我可以使用 Bash 脚本命令来执行此操作,例如:“docker inspect --format ' .NetworkSettings.IPAddress ' db` 如果将来可能出现这种情况,我将在 docker-compose 问题中发表评论.. .

以上是关于Docker 链接容器作为构建参数的主要内容,如果未能解决你的问题,请参考以下文章

软链接迁移 Docker 容器存储位置

Docker下构建centos7容器无法使用systemctl命令的解决办法

将文件作为参数传递给 Docker 容器

Docker&Kubernetes ❀ Docker 容器技术笔记链接梳理

Docker&Kubernetes ❀ Docker 容器技术笔记链接梳理

Docker容器学习梳理-Dockerfile构建镜像