首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >码头组合链接似乎不起作用

码头组合链接似乎不起作用
EN

Stack Overflow用户
提问于 2016-02-08 20:07:17
回答 1查看 2.3K关注 0票数 4

我正在使用Docker运行一个在开发中的药剂/凤凰应用程序。这个设置非常标准,包括postgres容器和web容器。

但是,我很难让web容器与数据库容器对话。

这是我的web容器Dockerfile

代码语言:javascript
复制
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

代码语言:javascript
复制
db:
  image: postgres
web:
  build: .
  command: mix phoenix.server
  volumes:
    - .:/src/blog
  ports:
    - "4000:4000"
  links:
    - db

当我运行docker-compose up时,似乎一切正常。但是,当我尝试运行(创建数据库)时:

代码语言:javascript
复制
$ docker run blogphoenix_web mix ecto.create

我得到以下错误:

** (混合)无法为Blog.Repo创建数据库,原因是: psql:无法将主机名"db“转换为地址:名称或服务未知

然后,如果我使用以下方法检查web容器的主机文件:

代码语言:javascript
复制
$ docker run blogphoenix_web cat /etc/hosts

..。我得到了这个输出:

代码语言:javascript
复制
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不应该为db容器创建一个主机名条目吗?

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

代码语言:javascript
复制
$ 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进入一个正在运行的容器。845f9d69cb1e是正在运行的blogphoenix_web映像版本的容器ID。

代码语言:javascript
复制
$ 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命令,我将从主机文件获得预期的输出,显示db容器的适当主机名链接:

代码语言:javascript
复制
$ 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容器设置有适当的主机文件链接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-08 20:25:34

您需要使用运行它:

代码语言:javascript
复制
docker-compose run web mix ecto.create

Docker创建链接容器,但是图像本身没有链接。这意味着blogphoenix_web不是链接到blogphoenix_db,而是在什么时候运行

代码语言:javascript
复制
docker-compose up

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35278344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档