mysql - 无法通过套接字连接到本地 MySQL 服务器 '/var/run/mysqld/mysqld.sock

标签 mysql ruby-on-rails docker-compose

我正在尝试使用 docker 运行一个 Ruby on Rails 项目,但我不知道如何让这些东西工作,可能是因为我不熟悉 docker。
我在 Ubuntu 16.04 上,从现在开始:

  • 我已经安装了 docker
  • 我已经安装了docker-compose
  • 我已经运行了成功运行的 docker-compose build
  • 但是 docker-compose run --rm web bin/setup 停止了,因为它不能 连接到mysql服务器

我得到的错误是:

#<Mysql2::Error: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)>
Couldn't create database for {"adapter"=>"mysql2", "host"=>"localhost", "username"=>"root", "password"=>"root", "pool"=>5, "timeout"=>5000,  "database"=>"project"}, {}
Created database 'project'
rails aborted!
Mysql2::Error: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

看这里的 stackoverflow 很多人说我必须确保 mysql 服务器正在运行。我怎样才能做到这一点? docker ps 的结果如下(省略了 COMMAND ans CREATED 列)

CONTAINER ID        IMAGE        STATUS              PORTS                              NAMES
9f03056e2b54        project_web  Up About an hour    0.0.0.0:3035->3035/tcp             project_webpack
465cfbac7cbd        mysql        Up About an hour    3306/tcp                           project_mysql

我的database.yml:

# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: mysql2
  host: localhost
  username: root
  password: root
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: project_local

# 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: &test
  <<: *default
  database: project_test

production:
  <<: *default
  database: db/production.sqlite3

staging:
  adapter: mysql2
  host: <MY HOST>
  database: project_dev
  username: root
  password: password
  pool: 5
  timeout: 5000
cucumber:
  <<: *test

还有我的docker-compose.yml:

version: '3.5'
services:
  web:
    build: .
    image: project_web
    container_name: project_web
    # restart: always
    command: >
      ./wait-for-it.sh db:3306 -- bash -c "
        rails server -p 3000 -b 0.0.0.0 --pid /app/tmp/pids/server.pid
        "
    ports: ["3000:3000"]
    volumes:
      - .:/app
      - ~/tmp:/host_tmp
      - bundle_cache:/bundle
    depends_on:
      - db
    environment:
      - DB_HOST=db
      - DB_USERNAME=root
      - DB_PASSWORD=root
  db:
    container_name: project_mysql
    image: mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
    volumes:
      - ./db-data:/var/lib/mysql
    restart: always
volumes:
  bundle_cache:
  # Mount volume with default driver

最佳答案

尝试将 database.yml 中的主机更改为 0.0.0.0 这解决了我的问题。

在服务器上下文中,0.0.0.0 表示本地计算机上的所有 IPv4 地址。如果主机有两个 IP 地址,192.168.1.1 和 10.1.2.1,并且主机上运行的服务器监听 0.0.0.0,则可以通过这两个 IP 访问它。

关于mysql - 无法通过套接字连接到本地 MySQL 服务器 '/var/run/mysqld/mysqld.sock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48344408/

相关文章:

docker - SEO URL 在带有 Docker 的 OpenCart 2.3 中给出 404 错误

docker - 微服务内部通信时的 SSL 证书主机名问题

docker - 使用 Docker 将现有的 Prestashop 部署到服务器

Python:无法运行 cx_freeze 创建的 Python 可执行文件(带有文本文件)

mysql (mariadb) 按两列排序不起作用

ruby-on-rails - jQuery ajax 请求未触发 Rails Controller 的 JS 响应?

ruby-on-rails - Rails 3.2.5 "cannot load such file -- aws-sdk"中回形针/S3 的问题

即使一切正确,更新后的 MySql 触发器也不会更新

sql - 我可以让这个具有复杂 COUNT 的 MySQL 语句更加高效吗?

ruby-on-rails - 从 Controller 访问 stylesheet_link_tag