Docker-compose: невозможно подключиться к mysql из приложения rails в первый раз, при следующем запуске все работает - PullRequest
0 голосов
/ 31 октября 2018

Я создаю среду разработки для приложения rails, используя docker, docker-compose и docker-sync. Когда я запускаю docker-compose в первый раз, он создает образ моего приложения rails и загружает образ mysql, но не может его подключить, но если я выйду из этого и снова запустите docker-compose up, все будет работать нормально. Вот мои настройки докера

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-compose dev файл для синхронизации томов

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

volumes:
   rails_app_volume_sync:
      external: true   

файл синхронизации докера

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, я получаю следующую ошибку после сборки образов.

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

если я остановлю контейнеры и снова запустлю его, он работает, почему он отказывает в первый раз?

1 Ответ

0 голосов
/ 01 ноября 2018

Проблема в том, что вы не ждете готовности базы данных перед запуском миграций. depends_on только гарантирует, что ваш процесс mysql в контейнере запущен, но он не может знать, когда процесс mysql инициализирован и доступен для обработки новых соединений.

Решение может состоять в том, чтобы ждать, пока порт TCP будет активен, некоторые используют wait-for-it для него. Другое решение заключается в простом сбое и перезапуске контейнера до тех пор, пока база данных не будет готова (установите для политики перезапуска контейнера значение всегда).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...