泊坞窗撰写链接似乎不起作用

我正在使用Docker Compose在开发中运行Elixir / Phoenix应用程序。 这个设置非常标准,有一个postgres容器和一个web容器。

但是,我很难让Web容器与数据库容器交谈。

这是我的Web容器Dockerfile

 FROM ubuntu:14.04 MAINTAINER me@example.com RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 ENV DEBIAN_FRONTEND noninteractive RUN apt-get update RUN apt-get install -y wget RUN apt-get install -y curl RUN apt-get install -y inotify-tools RUN apt-get install -y postgresql-client RUN wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb \ && dpkg -i erlang-solutions_1.0_all.deb RUN curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash - RUN apt-get install -y nodejs RUN apt-get update RUN apt-get install -y esl-erlang RUN apt-get install -y elixir RUN mix local.rebar RUN mix local.hex --force ADD . src/blog/ WORKDIR src/blog/ RUN mix deps.get RUN mix deps.compile 

这是我docker-compose.yml

 db: image: postgres web: build: . command: mix phoenix.server volumes: - .:/src/blog ports: - "4000:4000" links: - db 

当我运行docker-compose up ,事情似乎工作正常。 但是,当我尝试运行(创build数据库):

 $ docker run blogphoenix_web mix ecto.create 

我得到以下错误:

**(Mix)无法创buildBlog.Repo的数据库,原因如下:psql:无法将主机名“db”翻译为地址:名称或服务未知

然后,如果我检查Web容器的hosts文件:

 $ docker run blogphoenix_web cat /etc/hosts 

…我得到这个输出:

 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.4 a86e4f02ea56 

Docker Compose是否应该为db容器创build主机名?

以下是我的Docker工具的一些相关版本号:

 $ docker-machine --version #=> docker-machine version 0.6.0, build e27fb87 $ docker-compose --version #=> docker-compose version 1.6.0, build unknown $ docker --version #=> Docker version 1.10.0, build 590d510 

编辑

好的,我刚刚注意到可能会帮助其他人阅读的东西。 这个命令, docker run blogphoenix_web cat /etc/hosts进入一个新的容器,而这个命令docker exec 845f9d69cb1e cat /etc/hosts进入一个正在运行的容器。 845f9d69cb1eblogphoenix_web映像正在运行的版本的容器标识。

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 845f9d69cb1e blogphoenix_web "mix phoenix.server" About an hour ago Up 2 minutes 0.0.0.0:4000->4000/tcp blogphoenix_web_1 21a6f48dfc3b postgres "/docker-entrypoint.s" About an hour ago Up 2 minutes 5432/tcp blogphoenix_db_1 

运行exec命令我得到hosts文件的预期输出,显示db容器的适当的主机名链接:

 $ docker exec 845f9d69cb1e cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 db_1 21a6f48dfc3b blogphoenix_db_1 172.17.0.2 blogphoenix_db_1 21a6f48dfc3b 172.17.0.2 db 21a6f48dfc3b blogphoenix_db_1 172.17.0.3 845f9d69cb1e 

换句话说,当我docker run blogphoenix_web mix ecto.create命令时,我在基于blogphoenix_web映像的新容器中执行mix ecto.create 。 这个新的容器不是用docker-compose启动的,因此没有相应的主机文件链接到db容器设置。

你需要使用docker-compose来运行它:

 docker-compose run web mix ecto.create 

Docker组合创build链接的容器,但图像本身没有链接。 这意味着blogphoenix_web没有链接到blogphoenix_db,但是当你运行

 docker-compose up 

新创build的容器“blogphoenix_web_1”和“blogphoenix_db_1”将被链接在一起。