我正在尝试让 docker 容器使用我的本地 mysql 数据库。使用 docker-compose up,我能够运行所有部分,但是,数据库以状态代码 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
给出以下输出:
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
中看到输出 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
关于mysql - Docker-Rails 无法连接 localhost mysql 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62785712/