【问题标题】:Docker compose and mysql issues connecting to local db连接到本地数据库的 Docker 组合和 mysql 问题
【发布时间】:2022-12-10 02:21:36
【问题描述】:

尽管我尽可能多地用谷歌搜索,但实际上并没有什么适合我的。

因此我的问题是:

我正在学习 docker 和 docker compose。 我做了一个 dockerfile:

# base image
FROM mysql:8.0-debian

# creating user to access db
RUN groupadd -r group-mysql && useradd -r -g user-mysql group-mysql

# required env variable
ENV MYSQL_ROOT_PASSWORD ale123
ENV MYSQL_USER user-mysql
ENV MYSQL_PASSWORD pass123

# expose the default port
EXPOSE 3306

当我 docker 运行等效容器并从容器内部执行命令时,mysql 部分工作得很好,它允许我创建表、用户数据库等。没有连接错误。

现在的问题是,我创建了一个(在我看来)等效的 docker compose 文件

services:
  mysql:
    image: mysql:8.0-debian
    command: sh -c "groupadd -r group-mysql && 
                   useradd -r -g user-mysql group-mysql &&
                   tail -f /dev/null"
    
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_USER: user-mysql
      MYSQL_PASSWORD: pass123
    ports:
      - 3306:3306

当我运行由上述 .yml 文件组成的 docker 时,我尝试运行 docker exec -it containername bash 然后运行 ​​mysql -u root -p 我收到此连接错误:错误 2002 (HY000):无法连接到本地MySQL 服务器通过 socket '/var/run/mysqld/mysqld.sock' (2)

我究竟做错了什么?有人能指出我正确的方向吗?

非常感谢

【问题讨论】:

    标签: mysql docker docker-compose docker-container


    【解决方案1】:

    删除command: 行。

    如果您提供 Compose command: 覆盖,则运行代替正常的主容器命令。在您的情况下,command: 覆盖运行几个命令,然后执行 tail -f /dev/null; “保持容器运行”命令正在运行代替实际的数据库服务器。

    您实际上不需要容器内的其他用户。此设置中没有任何内容使用该用户。默认的 mysql 图像设置将 MySQL 服务器作为前台进程运行,这就是您需要的行为。

    【讨论】:

    • (从我在其他 SO 问题中看到的情况来看,您永远不需要 tail -f /dev/null 命令。这通常是为了“让容器保持活动状态”,以便您可以使用 docker exec 之类的调试工具来对付它。但是容器是基本上是一个进程的包装器,如果容器不打算做任何事情,你也可以让它退出并docker run一个临时容器来调试图像设置。)
    猜你喜欢
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多