Приложение Rails, использующее docker-compose, не подключается к контейнеру mysql - PullRequest
0 голосов
/ 30 марта 2019

Попытка запустить приложение rails с помощью docker-compose.Я запускаю сборку docker-compose, и она завершается без ошибок.Затем я запускаю docker-compose, и оба контейнера запускаются.Затем я запускаю docker-compose, запускаем web rake db: create db: migrate и сталкиваюсь с ошибкой:

rake aborted!Mysql2 :: Ошибка :: ConnectionError: Невозможно подключиться к серверу MySQL на 127.0.0.1 (111 «Отказ в соединении»)

Мой Dockerfile:

FROM ruby:2.5.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs mysql-client sqlite3 zlib1g-dev libxslt-dev git  && \
gem install bundler
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

Docker-compose

version: '3.3'
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'online_community_development'
      MYSQL_ROOT_PASSWORD: '******'
      MYSQL_HOST: 'localhost'
    ports:
      # <Port exposed> : < MySQL Port running inside container>
      - '3306:3306'
    expose:
      # Opens port 3306 on the container
      - '3306'
      # Where our data will be persisted
    volumes:
      - 'my-db:/var/lib/mysql'
    container_name: datab




  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
    - web-app:/myapp
    ports:
    - "3000:3000"
    depends_on:
    - db
    links:
      - db:db
    restart: always

volumes:
  my-db: {}
  web-app: {}

Database.yml

development:
  adapter: mysql2
  encoding: utf8
  database: online_community_development
  pool: 5
  username: root
  password: slumland
  socket: /var/run/mysqld/mysqld.sock
  host: db

Впервые в Docker, поэтому даже не уверен, правильно ли я выполняю команды.Мне нужно создать и заполнить базу данных и подключить к ней контейнер приложения.Я думаю, что проблема связана с тем, что он пытается подключиться через localhost, но даже когда я изменил хост на db, я все равно получил те же результаты.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

ТЛ; др:
Попробуйте это docker-compose.yml:

version: '3.3'
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'online_community_development'
      MYSQL_ROOT_PASSWORD: '******'
      MYSQL_HOST: 'localhost'
    expose:
    # Opens port 3306 on the container
      - '3306'
    # Where our data will be persisted
    volumes:
      - 'my-db:/var/lib/mysql'
    container_name: datab

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    environment:
      DATABASE_URL: 'mysql2://db'
      RAILS_ENV: 'development'
    volumes:
    - web-app:/myapp
    ports:
    - "3000:3000"
    depends_on:
    - db
    restart: always

volumes:
  my-db: {}
  web-app: {}

Подробно:
Прежде всего, ваш docker-compose -файл как-то неправильно настроен.
Поэтому я сделаю небольшую инструкцию по docker-compose.yml -файлам, прежде чем перейти к вашему вопросу.

links: - это устаревшая особенность docker, которую вам следует строго избегать:
https://docs.docker.com/compose/compose-file/#links
Более того, это даже не требуется при работе с docker-compose

Кроме того, вы используете expose: и ports: при определении службы базы данных.
Клавиша ports открывает порт на вашей хост-машине и перенаправляет его в ваш докер-сервис:
https://docs.docker.com/compose/compose-file/#ports
Использование клавиши ports в определениях базы данных делает вашу базу данных доступной для www - что в большинстве случаев не то, что вам нужно.

Клавиша expose открывает порт локально, в созданной сети Docker.
https://docs.docker.com/compose/compose-file/#expose
Это то, что мы хотим для баз данных.

Редактирование файла docker-compose.yml приводит к следующему:

version: '3.3'
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'online_community_development'
      MYSQL_ROOT_PASSWORD: '******'
      MYSQL_HOST: 'localhost'
    expose:
    # Opens port 3306 on the container
      - '3306'
    # Where our data will be persisted
    volumes:
      - 'my-db:/var/lib/mysql'
    container_name: datab

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
    - web-app:/myapp
    ports:
    - "3000:3000"
    depends_on:
    - db
    restart: always

volumes:
  my-db: {}
  web-app: {}

Возвращаясь к вашей основной проблеме:
rake aborted! Mysql2::Error::ConnectionError: Can't connect to MySQL server on '127.0.0.1' (111 "Connection refused")

Похоже, rake ожидает, что база данных будет доступна на localhost - поэтому я думаю, что причиной этой проблемы является неверная конфигурация.
К сожалению, я не очень знаком с rake, но, тем не менее, ваш database.yaml выглядит правильно.
Я провел небольшое исследование и наткнулся на этот пост:
Rake-задачи игнорируют конфигурацию database.yml
Возможно, вы можете попытаться установить переменную окружения DATABASE_URL в вашем docker-compose -файле: DATABASE_URL=mysql://db
Я также рекомендовал бы установить правильную переменную context-environment: RAILS_ENV=development

Когда вы делаете все эти изменения, вы должны придумать следующее docker-compose.yml:

version: '3.3'
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'online_community_development'
      MYSQL_ROOT_PASSWORD: '******'
      MYSQL_HOST: 'localhost'
    expose:
    # Opens port 3306 on the container
      - '3306'
    # Where our data will be persisted
    volumes:
      - 'my-db:/var/lib/mysql'
    container_name: datab

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    environment:
      DATABASE_URL: 'mysql2://db'
      RAILS_ENV: 'development'
    volumes:
    - web-app:/myapp
    ports:
    - "3000:3000"
    depends_on:
    - db
    restart: always

volumes:
  my-db: {}
  web-app: {}

Надеюсь, это поможет.

С уважением,
Hermsi

0 голосов
/ 31 марта 2019

Ваша БД, похоже, настроена на прослушивание только на локальном хосте. К сожалению, это не будет работать, так как технически ваше приложение является другим сетевым узлом (контейнером) в пределах составной сети. Попробуйте заставить вашу базу данных слушать все сетевые интерфейсы.

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