[英]Docker-Rails Can't Connect localhost mysql database
我正在尝试让 docker 容器使用我的本地 mysql 数据库。 使用 docker-compose 启动,我可以让所有部分运行,但是,db 以状态码 1 退出,并且 rails 应用程序无法连接到任何数据库实例。 我知道 mysql 正在我的系统上运行并且服务已经启动。 我的 docker-compose 文件:
version: '3'
services:
db:
image: mysql
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: db
MYSQL_USER: root
MYSQL_PASSWORD: password
volumes:
- ./tmp/db:/var/lib/mysql
web:
build: .
image: rails-devise:1.0.0
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- ".:/baas-status"
ports:
- "3000:3000"
depends_on:
- db
我知道容器正在运行,因为docker ps
给出了以下 output:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a49aba0cd68 rails-devise:1.0.0 "entrypoint.sh bash …" 23 minutes ago Up 2 minutes 0.0.0.0:3000->3000/tcp status_web_1
38554baf5efc mysql "docker-entrypoint.s…" 23 minutes ago Up 2 minutes 3306/tcp, 0.0.0.0:3002->3002/tcp, 33060/tcp status_db_1
即使我暴露了端口 3002 并想将其用作数据库的端口,它是否因为我在错误的端口上而无法连接? 我在docker ps
output 中看到 mysql 在端口 3306 上。
我的 database.yml 文件:
base: &base
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
default: &default
<<: *base
username: <%= ENV['DB_USERNAME'] %>
password: <%= ENV['DB_PASSWORD'] %>
host: <%= ENV['DB_HOST'] %>
database: <%= ENV['DB_NAME'] %>
development:
<<: *base
username: root
password: password
host: db
database: db
我还尝试将开发主机编辑为host: db
。 这也没有改变任何东西。 我也尝试运行docker-compose run web rake db:create
,但出现以下错误:
通过对 docker-compose 文件的当前更改已修复此问题 无法通过套接字“/var/run/mysqld/mysqld.sock”连接到本地 MySQL 服务器 (2)
在这一点上,我不知道从哪里开始。 任何信息或帮助将不胜感激。 谢谢你。
编辑:
我已经更改了数据库的端口,它似乎已经解决了连接问题。 现在我遇到了一个错误
web_1 | Mysql2::Error::ConnectionError (Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory):
我将进行一些研究以找出此错误背后的含义,但是,任何朝着正确方向前进的提示都将不胜感激!
编辑2:
我最终通过将 mysql 恢复到 5.7.18 来避免 sha 身份验证来连接数据库。 对我有用的 docker-compose 文件和设置如下:
docker-compose.yml
version: '2'
services:
db:
image: mysql:5.7.18
restart: always
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=root
volumes:
- db-data:/var/lib/mysql
web:
build: .
image: rails-devise:1.0.0
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- ".:/baas-status"
ports:
- 3000:3000
links:
- db
depends_on:
- db
volumes:
db-data:
driver: local
除了将密码更改为 root 之外,database.yml 文件保持不变。 这是对我有用的解决方案。
听起来你发现了连接问题。 根据您发布的 docker-compose 文件,您需要连接3306
,而不是3002
。
我假设您还确保在您的 rails docker 容器中定义这些环境变量。 那是对的吗?
username: <%= ENV['DB_USERNAME'] %>
password: <%= ENV['DB_PASSWORD'] %>
host: <%= ENV['DB_HOST'] %>
database: <%= ENV['DB_NAME'] %>
由于您没有在 docker-compose 文件中定义要使用的 mysql 图像的标签,因此它将提取latest
的图像 mysql ~8.x
。 MySQL 8 默认使用caching_sha2_password
身份验证插件(除非您另外指定)。 您使用的 Rails mysql2
驱动程序版本可能还不支持这种身份验证机制。
因此,如果您想恢复到较旧的身份验证插件(例如 mysql 5.7 中的插件),您可以在 mysql 容器中使用命令行标志,如下所示:
services:
...
db:
image: mysql:8.0
...
command: mysqld --default-authentication-plugin=mysql_native_password
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.