Я пытаюсь использовать Docker compose и Dockerfile для подключения моего приложения Ruby on Rails к базе данных Mariadb и импорта базы данных (файл .sql) в эту базу данных.
Я использую gem 'mysql2', '>= 0.3.18', '< 0.5'
В config / database.yml я пробовал:
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: somepassword
host: mysql2://root:[email protected]:3306/mydatabase
development:
<<: *default
Я также попытался заменить вышеперечисленное на следующее:
default: &default
url: <%= ENV['DATABASE_URL'] %>
development:
<<: *default
В Dockerfile я добавил:
# after COPY . .
RUN bundle exec rake RAILS_ENV=production DATABASE_URL=mysql2://root:[email protected]:3306/mydatabase SECRET_TOKEN=sometoken assets:precompile
CMD bundle exec unicorn -c config/
В docker-compose.yml:
services:
mysql:
image: mariadb:10.3
container_name: mysql
volumes:
- ./database.sql:/docker-entrypoint-initdb.d/database.sql
- ~/.docker-volumes/database/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somepassword
MYSQL_DATABASE: mydatabase
ports:
- '3306:3306'
rails_app:
build: .
restart: always
container_name: rails_app
environment:
DATABASE_URL: mysql2://root:somepassword@mysql/mydatabase
links:
- mysql:sql_srv
- redis
- elasticsearch
volumes:
- .:/rails_app
ports:
- '3000:3000'
env_file:
- .rails_app.env
В .rails_app.env:
SECRET_KEY_BASE=sometoken
WORKER_PROCESSES=1
LISTEN_ON=127.0.0.1:3000
DATABASE_URL=mysql2://root:[email protected]:3306/mydatabase
Ошибка, которую я получил при моей последней попытке, была:
Mysql2::Error: Can't connect to MySQL server on '127.0.0.1' (111 "Connection refused")
...
ERROR: Service 'rails_app' failed to build: The command '/bin/sh -c bundle exec rake RAILS_ENV=production DATABASE_URL=mysql2://root:[email protected]:3306/mydatabase SECRET_TOKEN=sometoken assets:precompile' returned a non-zero code: 1
Как я могу исправить эту проблему и успешно подключить приложение rails к mariadb через Docker Compose?
Любая помощь, пожалуйста?





Попробуйте сменить database.yml на
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: somepassword
host: sql_srv
database: mydatabase
port: 3306
Также удалите DATABASE_URL из bundle exec rake в Dockerfile.
Вы пытаетесь подключить базу данных на 127.0.0.1, но на самом деле ваша БД находится в другом контейнере докеров в той же сети, в
links:
- mysql:sql_srv
- redis
- elasticsearch
вы переходите к сервису rails_app ссылку на сервис базы данных и устанавливаете псевдоним sql_srv
Из приложения rails вы можете подключиться к базе данных, используя эту ссылку, которая будет разрешена в сети докеров для службы mysql.
что такое sql_srv?
Попробуйте в обоих сервисах раздел
network_mode: host