【问题标题】:Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock无法通过套接字'/var/run/mysqld/mysqld.sock 连接到本地 MySQL 服务器
【发布时间】:2018-01-19 15:27:48
【问题描述】:

我正在尝试使用 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 和 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

【问题讨论】:

  • 不要使用主机“localhost”,而是使用“mysql”
  • SSH 到您的服务器并运行sudo find / -type s 以查看您的mysql 套接字的位置并查看它是否与/var/run/mysqld/mysqld.sock 匹配

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


【解决方案1】:

尝试将你的 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 都可以访问它。

【讨论】:

    【解决方案2】:

    在运行 docker-compose 之前尝试运行容器本身:

    docker run --rm -it mysql-server:latest bash
    

    这应该会在容器内为您提供一个正常的 shell 环境。从那里您可以尝试 mysql,配置您的服务器,启动或停止它以及您可以在“普通”Linux 上执行的任何其他操作。

    ps:如果您需要 mor 工具,请尝试 apt-get update 然后安装您需要的工具。

    【讨论】:

    • 感谢您的帮助,但我仍然不明白应该更改什么
    • 你运行了我的命令吗?你检查你的mysql服务器是否正在运行?您是否暴露了服务器(/etc/my.ini -> bind-address=0.0.0.0)?您可以使用容器的 IP 地址和普通的 mysql 命令从您的 ubuntu 机器连接到它吗?
    • 您的命令运行良好,但我必须添加sudo。我可以通过mysql -u root -p -h 172.18.0.2 连接到它
    • 你是从你的 ubuntu 机器上连接的吗?如果是,那么您已经有了解决方案:您必须将设置更改为上面的 IP 地址。否则尝试从您的 ubuntu 连接。如果失败,mysql 不接受来自容器外部的连接。那将是您必须更改绑定地址的地方。
    • 我已将database.yml 中的主机更改为db 而不是localhost,一切顺利
    【解决方案3】:

    对于类似的docker-compose.yml,我的解决方案是删除db 服务中定义的命名卷:

    $ docker volume ls # confirm the named volume is present
    DRIVER      VOLUME_NAME
    local       db-data
    
    $ docker-compose down # stop/remove your containers for this project
    
    $ docker volume rm db-data # remove the (possibly) problematic volume
    
    $ docker-compose up # start the project in the foreground and hopefully not see the socket connection error in the logs
    

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 2016-02-17
      • 2012-01-10
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多