Я хочу удалить "Mysql2 :: Error :: ConnectionError (Неизвестный хост сервера MySQL 'db' (0)):" - PullRequest
1 голос
/ 08 октября 2019

окружение

- MacOS Mojave 10.14.6
- Ruby 2.6.4
- Rails 5.2.2
- mysql  Ver 8.0.17 for osx10.14 on x86_64 (Homebrew)
- Docker 2.1.0.3

Что я хочу реализовать

Я хочу устранить следующую ошибку.

Mysql2::Error::ConnectionError (Unknown MySQL server host 'db' (0)):

Терминал

$ rails s
=> Booting Puma
=> Rails 5.2.2 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.4-p104), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
Started GET "/" for ::1 at 2019-10-07 22:11:28 +0900

Mysql2::Error::ConnectionError (Unknown MySQL server host 'db' (0)):
...
$ docker-compose ps
      Name                    Command               State           Ports
--------------------------------------------------------------------------------
rails_test_db_1    docker-entrypoint.sh mysqld      Up       3306/tcp, 33060/tcp
rails_test_web_1   bundle exec rails s -p 300 ...   Exit 1

docker-compose.yml

version: '3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      - 3000:3000
    depends_on:
      - db
    tty: true
    stdin_open: true
  db:
    image: mysql:5.7
    volumes:
      - db-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
volumes:
  db-volume:

database.yml

# MySQL. Versions 5.0 and up are supported.
#
# Install the MySQL driver
#   gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
#   gem 'mysql2'
#
# And be sure to use new-style password hashing:
#   http://dev.mysql.com/doc/refman/5.7/en/old-client.html
#
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: password
  host: db

development:
  <<: *default
  database: app_development

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: app_test

# As with config/secrets.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password as a unix environment variable when you boot
# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full rundown on how to provide these environment variables in a
# production deployment.
#
# On Heroku and other platform providers, you may have a full connection URL
# available as an environment variable. For example:
#
#   DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase"
#
# You can use this database configuration with:
#
#   production:
#     url: <%= ENV['DATABASE_URL'] %>
#
production:
  <<: *default
  database: app_production
  username: app
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Эта ошибка говорит о том, что хост db неизвестен.

Вы используете rails s на своем терминале. Это запускает ваш сервер rails за пределами докера, поэтому хост db не может быть разрешен. (У вас есть только такое разрешение DNS для контейнеров, работающих в одной и той же сети докеров)

Вы просто должны запустить docker-compose up, чтобы обе службы определялись в вашем docker-compose.yml(web и db) запускаются в одной сети (docker-compose позаботится об этом, вам не нужно делать никаких дополнительных настроек для этого)

0 голосов
/ 08 октября 2019

Вы можете создать сеть, которая будет совместно использоваться в вашем докере между изображениями

networks:
  my_network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.25.0.1/16
          gateway: 172.25.0.1

Затем назначить конкретный IP для вашего контейнера БД:

networks:
  my_network:
    ipv4_address: 172.25.0.3

После этого вам нужно сделатьконечно db имя хоста связано с IP-адресом контейнера БД. Код ниже добавит новую строку 172.25.0.3 db к вашему /etc/hosts файлу.

extra_hosts:
  - 'db:172.25.0.3'

Окончательная версия docker-compose будет выглядеть следующим образом:

version: '3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      - 3000:3000
    depends_on:
      - db
    tty: true
    stdin_open: true
  extra_hosts:
    - 'db:172.25.0.3'

  db:
    image: mysql:5.7
    volumes:
      - db-volume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
    networks:
      my_network:
        ipv4_address: 172.25.0.3

volumes:
  db-volume:

networks:
  my_network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.25.0.1/16
          gateway: 172.25.0.1

Если вы сделаете это, вы можете быть уверены, что хост db будет всегда доступен. Я надеюсь, что это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...