代码之家  ›  专栏  ›  技术社区  ›  arjunsv3691

Docker compose:第一次无法从rails应用程序连接到mysql,下次运行它就可以了

  •  0
  • arjunsv3691  · 技术社区  · 7 年前

    我正在使用docker、docker compose和docker sync为rails应用程序创建开发人员环境。当我第一次运行docker compose up时,它构建了我的rails应用程序的映像并下载了mysql映像,但无法连接它,但如果我退出此操作并再次运行docker compose up,一切正常。这是我的docker配置

    Dockerfile:
    FROM ruby:2.5.1
    
    RUN apt-get update && \
          apt-get -y install sudo
    
    RUN apt-get update && apt-get install -y \ 
      build-essential \ 
      nodejs \
      vim \
      mysql-client \
      apt-transport-https \
      build-essential
    
    RUN curl -s -N https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -\
        && echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list \
        && apt-get update \
        && apt-get install -y yarn 
    
    RUN mkdir /rails-app
    ENV RAILS_HOME /rails-app
    
    
    WORKDIR /tmp
    ADD Gemfile Gemfile
    ADD Gemfile.lock Gemfile.lock
    RUN bundle install
    
    WORKDIR /rails-app
    ADD . /rails-app
    
    EXPOSE 3000
    CMD ["bash"]
    

    下面是我的码头工人

    docker-compose.yml
    version: '3'
    services:
        web:
          image: "rails_app"
          build: .
          ports:
            - "3000:3000"
          env_file:
            - web_env
            - db_env
          depends_on:
            - db
          command: >
              bash -c "bundle exec rails db:schema:load &&
                       bundle exec rails db:seed &&
                       rm -f tmp/pids/server.pid &&
                       bundle exec rails s -p 3000 -b '0.0.0.0'"
        db:
          image: library/mysql:5.6.42
          env_file:
            - db_env
    

    docker编写用于卷同步的开发文件

    docker-compose-dev.yml
    version: '3'
    services:
          web:
             volumes:
                - rails_app_volume_sync:/rails-app:nocopy
    
    volumes:
       rails_app_volume_sync:
          external: true   
    

    docker同步文件

    docker-sync.yml
    version: "2"
    syncs:
        rails_app_volume_sync:
           src: '.'
           sync_host_ip: 'auto'
           sync_strategy: 'unison'
           notify_terminal: true
    

    web_env:
    DATABASE_HOST=db
    RAILS_ENV=development
    
    db_env:
    MYSQL_DATABASE=development_exp
    MYSQL_ROOT_PASSWORD=root
    MYSQL_USER=dev
    MYSQL_PASSWORD=dev
    

    我的数据库配置如下:

    development:
      adapter: mysql2
      encoding: utf8
      database: <%= ENV['MYSQL_DATABASE'] %>
      username: <%= ENV['MYSQL_USER'] %>
      password: <%= ENV['MYSQL_PASSWORD'] %>
      host: <%= ENV['DATABASE_HOST'] %>
      reconnect: true
      pool: 5
    

    当我运行docker sync stack start时,在生成映像之后,我得到以下错误。

    web_1  | Mysql2::Error::ConnectionError: Can't connect to MySQL server on 'db' (111 "Connection refused")
    

    如果我停止容器并再次运行它,它工作了,为什么它第一次出现故障?

    1 回复  |  直到 7 年前
        1
  •  2
  •   codestation    7 年前

    问题是,在运行迁移之前,您没有等待数据库准备就绪。 depends_on

    一个解决方案可以是等待TCP端口启动,一些使用 wait-for-it 为了它。另一种解决方案是简单地失败并重新启动容器,直到数据库准备就绪(将容器的重新启动策略设置为“始终”)。