首页 > 解决方案 > 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 连接?

请问有什么帮助吗?

标签: ruby-on-railsdockerdocker-composemariadbdockerfile

解决方案


尝试更改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_URLbundle exec rakeDockerfile 中删除

您尝试连接数据库,127.0.0.1但实际上您的数据库位于同一网络中的另一个 docker 容器上,在

links:
  - mysql:sql_srv
  - redis
  - elasticsearch

您将rails_app服务链接传递给数据库服务并将别名设置为sql_srv

从 rails 应用程序,您可以使用该链接连接到数据库,该链接将在 docker 网络中解析为mysql服务。


推荐阅读