非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
问题原因
- 权限冲突:Bitnami官方镜像默认使用非root用户(如
bitnami或UID为1001的用户)运行MySQL进程。如果之前用user: root启动过容器,挂载的usermysql_data卷内的文件权限会被设置为root所有,之后移除user: root用默认非root用户启动时,MySQL进程没有权限访问数据目录和socket文件路径,导致MySQL无法正常启动,外部自然连接被拒绝。 - 容器内连接失败的本质:因为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 whoamibitnami或对应UID的用户名。 - 用
Slimo300用户连接数据库:
此时应该能成功进入数据库命令行,应用也能正常连接。docker exec -it usermysql mysql -u Slimo300 -ppassword123 dbusers
内容的提问来源于stack exchange,提问作者user10891322
相关产品推荐
相关产品推荐

