You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非root用户无法连接bitnami/mysql容器的问题及解决

问题:Bitnami MySQL容器非root用户运行时连接失败

部署基于bitnami/mysql镜像的MySQL数据库和应用时,运行docker-compose出现连接错误:

[error] failed to initialize database, got error dial tcp 192.168.128.3:3306: connect: connection refused
2023/01/14 19:52:53 Error when connecting to database: dial tcp 192.168.128.3:3306: connect: connection refused

仅在docker-compose的usermysql服务中添加user: root配置后连接才能正常工作,但不想以root用户运行容器。尝试进入容器用非root用户Slimo300连接时也失败:

I have no name!@usermysql:/$ mysql -u Slimo300 -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/opt/bitnami/mysql/tmp/mysql.sock' (2)

原docker-compose服务定义:

usermysql:
    image: bitnami/mysql
    container_name: usermysql
    hostname: usermysql
    user: root #<------- root
    networks:
      - chatnet
    volumes:
      - usermysql_data:/bitnami/mysql/data
    environment:
      - MYSQL_DATABASE=dbusers
      - MYSQL_ROOT_PASSWORD=password123
      - MYSQL_USER=Slimo300
      - MYSQL_PASSWORD=password123
  userservice:
    build:
      context: .
      dockerfile: ./backend/user-service/Dockerfile
    container_name: userservice
    hostname: userservice
    networks: 
      - chatnet
    ports:
      - "8083:8080"
    depends_on:
      - usermysql
    restart: on-failure

问题原因

  1. 权限冲突:Bitnami官方镜像默认使用非root用户(如bitnami或UID为1001的用户)运行MySQL进程。如果之前用user: root启动过容器,挂载的usermysql_data卷内的文件权限会被设置为root所有,之后移除user: root用默认非root用户启动时,MySQL进程没有权限访问数据目录和socket文件路径,导致MySQL无法正常启动,外部自然连接被拒绝。
  2. 容器内连接失败的本质:因为MySQL进程没启动,所以/opt/bitnami/mysql/tmp/mysql.sock文件不存在,导致本地socket连接报错。

解决方案

1. 清理旧权限的卷并重新启动

Bitnami镜像已经做好了非root运行的配置,不需要手动指定user参数,只需修复卷的权限问题:

  • 停止容器并删除关联的数据卷(注意:这会清除现有数据库数据,如有重要数据请先备份):
    docker-compose down -v
    
  • 修改usermysql服务配置,移除user: root这一行,修改后的配置如下:
    usermysql:
        image: bitnami/mysql
        container_name: usermysql
        hostname: usermysql
        networks:
          - chatnet
        volumes:
          - usermysql_data:/bitnami/mysql/data
        environment:
          - MYSQL_DATABASE=dbusers
          - MYSQL_ROOT_PASSWORD=password123
          - MYSQL_USER=Slimo300
          - MYSQL_PASSWORD=password123
    userservice:
        build:
          context: .
          dockerfile: ./backend/user-service/Dockerfile
        container_name: userservice
        hostname: userservice
        networks: 
          - chatnet
        ports:
          - "8083:8080"
        depends_on:
          - usermysql
        restart: on-failure
    
  • 重新启动服务:
    docker-compose up -d
    

2. 验证配置

  • 查看容器内运行MySQL的用户:
    docker exec -it usermysql whoami
    
    正常会显示bitnami或对应UID的用户名。
  • 用Slimo300用户连接数据库:
    docker exec -it usermysql mysql -u Slimo300 -ppassword123 dbusers
    
    此时应该能成功进入数据库命令行,应用也能正常连接。

内容的提问来源于stack exchange,提问作者user10891322

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:01:39