ruby-on-rails - docker-compose:无法将 Rails 应用程序连接到 Mysql
问题描述
我正在尝试使用 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:somepassword@127.0.0.1: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:somepassword@127.0.0.1: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:somepasssword@127.0.0.1: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:somepassword@127.0.0.1:3306/mydatabase SECRET_TOKEN=sometoken assets:precompile' returned a non-zero code: 1
如何解决此问题并通过 Docker compose 成功将 rails 应用程序与 mariadb 连接?
请问有什么帮助吗?
解决方案
尝试更改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
但实际上您的数据库位于同一网络中的另一个 docker 容器上,在
links:
- mysql:sql_srv
- redis
- elasticsearch
您将rails_app
服务链接传递给数据库服务并将别名设置为sql_srv
从 rails 应用程序,您可以使用该链接连接到数据库,该链接将在 docker 网络中解析为mysql
服务。
推荐阅读
- c++ - C++ 模板继承
- slack - 在完整消息中扩展 slack bot 菜单颜色条(节点、slack 块套件、slack api)
- c - 如何检查 ioctl 是否执行?
- php - Symfony 5 中 EntityType 的数据覆盖问题(与 ChoiceType 相同的问题)
- python - 我将如何计算在 PIL 中保持两个绘制句子之间的空间所需的 X 坐标?
- python - 我可以用另一个在 python 中具有相同键的字典的值来更改字典的键吗?
- swift - 快速获取每天的睡眠总数
- asp.net-core-mvc - 如何在 ASP.Net Core 的 HTML 标记中添加 c# 代码
- ffmpeg - 如何在 ffmpeg 中合成三个带音频的重叠视频?
- ios - 如何使用音频引擎和 AVaudioplayernode 播放音频文件以允许音高控制