如何在构建时链接 docker 容器?

Posted

技术标签:

【中文标题】如何在构建时链接 docker 容器?【英文标题】:How to link docker containers on build? 【发布时间】:2014-12-20 11:45:31 【问题描述】:

我在 run 上将我的应用容器链接到 postgres:

docker run --link postgres:postgres someproject/develop

效果很好。

但我意识到我需要在run 之前使用 django 命令将一些东西安装到数据库中。所以我需要在build时进行链接。

我该怎么做?

docker build -h 没有--link 选项。

【问题讨论】:

您具体需要做什么?你想在你的数据库上运行一个脚本吗? @behe 之类的。我需要运行两个 django 管理命令来为应用程序准备数据库。但简单来说——是的,我需要为我的数据库运行一些脚本。 可以在构建图像时启动数据库并填充它。无法在构建时链接容器。 (可能是:mywiki.wooledge.org/XyProblem) @behe 怎么样?我不想在应用程序容器中拥有数据库(我现在拥有的) PS 我知道 XYProblem 是什么,我询问了我需要的功能。 【参考方案1】:

没错,但docker build 确实接受--network 选项。

您可以将必备容器放在命名/自定义网络上,例如:

docker network create whatever
docker run --network whatever --name postgres [etc.] someproject/develop

然后在该网络上构建:

docker build --network whatever [etc.]

效果很好。

【讨论】:

【参考方案2】:

我遇到了类似的问题。我想在apt-cacher 的帮助下加快图像构建速度。它在自己的容器中运行,并且我构建的其他图像必须以某种方式与之通信。

解决方案是在所有接口上发布apt-cacher 端口。这包括例如docker0,可用于在映像构建期间生成的中间容器。

例如Dockerfile:

FROM debian:8

RUN ping -c 2 172.17.0.1

这就是它的构建方式:

$ docker build - <dock
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM debian:8
 ---> 47af6ca8a14a
Step 2 : RUN ping -c 2 172.17.0.1
 ---> Running in 4f56ce7c7b63
PING 172.17.0.1 (172.17.0.1): 56 data bytes
64 bytes from 172.17.0.1: icmp_seq=0 ttl=64 time=0.117 ms
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.130 ms
--- 172.17.0.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.117/0.123/0.130/0.000 ms
 ---> 5c73a36a0a6a
Removing intermediate container 4f56ce7c7b63

【讨论】:

你试过用compose吗?你是怎么发现这个ip:172.17.0.1的? 172.17.0.1 是为docker0 接口分配的默认地址(您可以通过将--bip 传递给docker daemon 来配置它。默认情况下,compose 将尝试将所有服务容器连接到一个私有的网络。又是一个网桥,它有一个不同的地址。【参考方案3】:

我从 docker 贡献者 Brian Goff 那里得到了答案:

docker run -d --name mydb postgres
docker run --rm --link mydb:db myrailsapp rake db:migrate
docker run -d --name myapp --link mydb:db myrailsapp

这将启动 postgres。 启动一个容器,该容器执行数据库迁移并立即退出并自行移除。 启动 rails 应用程序。

将构建过程想象成编译应用程序。作为编译阶段的一部分,您不会将数据播种到数据库中。

【讨论】:

【参考方案4】:

你不能这样做。您可以构建 postgres 的子映像,也可以在每次启动容器时更新数据库。

【讨论】:

@syabro 你检查过 ONBUILD 命令了吗?检查这个docs.docker.com/reference/builder/#onbuild

以上是关于如何在构建时链接 docker 容器?的主要内容,如果未能解决你的问题,请参考以下文章

如何选择将锁定文件添加到 docker 容器?

如何构建Memcached Docker容器

Docker 容器整合 Spring Boot 应用

如何让 Java 测试容器在 Docker 多阶段构建中工作?

如何从docker容器中获取docker主机的IP地址

使用 docker-compose 时如何在容器内使用主机用户修改卷文件