mysql - Docker-Rails 无法连接 localhost mysql 数据库

标签 mysql ruby-on-rails docker docker-compose

我正在尝试让 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 文件保持不变。这是对我有用的解决方案。

Resource I ended up using!

最佳答案

听起来您已经解决了连接问题。根据您发布的 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

More information can also be found on this SO answer.

关于mysql - Docker-Rails 无法连接 localhost mysql 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62785712/

相关文章:

mysql - 在mysql中插入数据和求和

ruby-on-rails - 设计和 Rspec 测试集成

ruby-on-rails - Ruby on Rails session 过期日期

linux - Docker 安装在用户家

python - 我可以将目录从 docker 区域之外的某个位置复制到我的 dockerfile 中吗?

php - MYSQL 数据库列未更新

mySQL 查询无法正常工作

ruby-on-rails - Jbuilder 将单个对象传递给部分对象

haskell - 构建docker镜像时堆栈GHCJS项目初始化错误

php - MySQL 查询首先返回大多数匹配项