Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker&x2B;Mysql ConnectionError:未知的Mysql服务器主机';db';_Mysql_Ruby On Rails_Docker - Fatal编程技术网

Docker&x2B;Mysql ConnectionError:未知的Mysql服务器主机';db';

Docker&x2B;Mysql ConnectionError:未知的Mysql服务器主机';db';,mysql,ruby-on-rails,docker,Mysql,Ruby On Rails,Docker,我在Rails+MySQL Docker设置中遇到了以下错误: Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2) /usr/local/bundle/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect' /usr/local/bundle/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `initialize'

我在Rails+MySQL Docker设置中遇到了以下错误:

Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2)
/usr/local/bundle/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect'
/usr/local/bundle/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `initialize'
我的
docker compose.yml

version: '3.7'
services:
  db:
    # https://github.com/passbolt/passbolt_docker/issues/103
    image: mysql:5.7
    restart: always
    healthcheck:
      test: ["CMD-SHELL", 'mysql --database=$$MYSQL_DATABASE --password=$$MYSQL_ROOT_PASSWORD --execute="SELECT count(table_name) > 0 FROM information_schema.tables;" --skip-column-names -B']
      interval: 30s
      timeout: 10s
      retries: 4
    environment:
      MYSQL_DATABASE: 'db'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: 'password'
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - "3305:3306"
    expose:
      - '3305'
    volumes:
      - my-db:/var/lib/mysql
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - '.:/app'
    ports:
      - '3000:3000'
    environment:
      DB_PORT: 3306
      DB_HOST: db
      DATABASE_URL: mysql2://user:password@db:3306
    depends_on:
      - db

volumes:
  my-db:
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: user
  password: password
  host: localhost
  url: <%= ENV['DATABASE_URL'] %>
  port: 3305
和我的
数据库.yml

version: '3.7'
services:
  db:
    # https://github.com/passbolt/passbolt_docker/issues/103
    image: mysql:5.7
    restart: always
    healthcheck:
      test: ["CMD-SHELL", 'mysql --database=$$MYSQL_DATABASE --password=$$MYSQL_ROOT_PASSWORD --execute="SELECT count(table_name) > 0 FROM information_schema.tables;" --skip-column-names -B']
      interval: 30s
      timeout: 10s
      retries: 4
    environment:
      MYSQL_DATABASE: 'db'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: 'password'
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - "3305:3306"
    expose:
      - '3305'
    volumes:
      - my-db:/var/lib/mysql
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - '.:/app'
    ports:
      - '3000:3000'
    environment:
      DB_PORT: 3306
      DB_HOST: db
      DATABASE_URL: mysql2://user:password@db:3306
    depends_on:
      - db

volumes:
  my-db:
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: user
  password: password
  host: localhost
  url: <%= ENV['DATABASE_URL'] %>
  port: 3305
default:&default
适配器:mysql2
编码:utf8mb4
游泳池:
用户名:user
密码:密码
主机:本地主机
网址:
港口:3305
根据,我应该等MySQL启动吗?然而,我在docker compose文件的
healthcheck
部分添加了一个运行状况检查,但它不起作用


我还尝试使用netcat检查端口,但它也不起作用。为什么我不能从Docker
web
容器连接到主机
db
?我做错了什么?

此消息抱怨缺少名为“db”的“MYSQL主机”

Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2)
根据您的docker编写文件

environment:
  MYSQL_DATABASE: 'db'
  MYSQL_USER: 'user'
  MYSQL_PASSWORD: 'password'
  MYSQL_ROOT_PASSWORD: 'password'
您应该在这里选择一个有效的参数(最好使用ENV变量)。 还要确保

  • 您可以使用指定的凭据从控制台访问MYSQL
  • 指定的MYSQL用户可以从外部主机访问(docker不在同一网络上)

  • 事实证明,对于我的问题,我需要清除docker卷并重新创建所有内容

    基本上是这样的:

    docker-compose down
    docker system prune --force --volumes
    
    然后重新启动所有操作,确保MySQL(“
    db
    ”)在尝试连接到
    db

    之前已成功运行。执行
    url:
    是毫无意义的。Rails将
    ENV['DATABASE\u URL']
    与配置合并。