如何在构建时链接 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 容器?的主要内容,如果未能解决你的问题,请参考以下文章