ТЛ; др:
Попробуйте это 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