【问题标题】:How to link docker containers on build?如何在构建时链接 docker 容器?
【发布时间】: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 是什么,我询问了我需要的功能。

标签: django postgresql docker


【解决方案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 的子映像,也可以在每次启动容器时更新数据库。

      【讨论】:

      猜你喜欢
      • 2017-01-11
      • 1970-01-01
      • 2016-04-16
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 2015-10-19
      相关资源
      最近更新 更多