Docker无法链接到非运行容器

kal*_*elc 55 mysql ruby-on-rails docker docker-compose

我需要使用docker-compose创建Rails和Mysql容器.当我尝试在容器之间创建链接时docker-compose up,我得到了

无法启动容器9b271c58cf6aecaf017dadaf5b无法链接到非运行容器:/ puma_db_1 AS/puma_web_1/db

Dockerfile

FROM ubuntu:14.04

RUN apt-get -y update
RUN apt-get -y install git curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev

RUN apt-get -y install libmysqlclient-dev
RUN git clone https://github.com/sstephenson/rbenv.git /root/.rbenv
RUN git clone https://github.com/sstephenson/ruby-build.git /root/.rbenv/plugins/ruby-build
RUN echo 'eval "$(rbenv init -)"' >> $HOME/.profile
RUN echo 'eval "$(rbenv init -)"' >> $HOME/.bashrc

RUN rbenv install 2.1.5
RUN rbenv global 2.1.5
RUN gem install rails -v 4.0.11

ADD app.tar.gz /home/
WORKDIR /home/app

RUN bundle install
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
Run Code Online (Sandbox Code Playgroud)

泊坞窗,compose.yml

db:  
  image: mysql:latest
  environment:
    MYSQL_DATABASE: app_development
    MYSQL_USER: mysql
    DATABASE_PASSWORD: onetwo
    ROOT_PASSWORD: onetwo
web:
  build: .
  command: bundle exec rails s -p 3000 -b '0.0.0.0'
  ports:
    - "4000:3000"
  links:
    - db
Run Code Online (Sandbox Code Playgroud)

Tho*_*eil 71

db容器很可能无法启动.

通过仅启动db服务确保它正常工作.您可以使用以下命令执行此操作:

docker-compose up db
Run Code Online (Sandbox Code Playgroud)

如果在此命令之后看起来MySQL服务没有运行,那么您找到了问题的根源.

  • 这指向了正确的方向.通常,如果链接容器无法启动,您会看到这一点.有趣的是,错误消息并没有告诉我. (2认同)

Mik*_*raf 36

与MySQL没有特别关系,但更多的是消息 ERROR: for <service> Cannot link to a non running container: /b2f21b869ccc_<dependency>_1 AS /<service>_1/<dependency>_1

我发现依赖容器的id与给定的id不同(b2f21b869ccc在上面的例子中)

简单地通过运行解决 docker-compose up -d --force-recreate <service>

这导致它重新创建依赖项并将链接修复为正确的docker id

  • 我最终做了`docker-compose rm`,它也删除了所有的容器.我想运行`docker rm CONTAINER_ID`替换那里有问题的容器id应该也可以. (2认同)
  • 多谢。这是一个救星。 (2认同)

Vil*_*ila 23

对我来说,它没有帮助运行docker-compose up db.

这对我有用:

sudo service docker restart

然后继续使用docker-compose up(-d)


Jor*_*elC 5

您可以尝试使用docker网络的新功能.为此,您必须删除docker-compose.yml中的link参数,并使用以下命令初始化容器.--x-networking option

docker-compose --x-networking up -d
Run Code Online (Sandbox Code Playgroud)

为防止docker为容器生成随机名称,这些名称将添加到每个容器的相应网络的/ etc/hosts文件中,您可以使用docker-compose.yml中container_name:密钥

db:  
  container_name: db
  image: mysql:latest
  environment:
    MYSQL_DATABASE: app_development
    MYSQL_USER: mysql
    DATABASE_PASSWORD: onetwo
    ROOT_PASSWORD: onetwo
web:
  container_name: web
  build: .
  command: bundle exec rails s -p 3000 -b '0.0.0.0'
  ports:
    - "4000:3000"
Run Code Online (Sandbox Code Playgroud)