Jenkins中搭建需MySQL/MariaDB的Java应用CI测试环境遇权限问题
解决Jenkins中Docker容器非root用户无法启动MariaDB的问题
我要给依赖MySQL/MariaDB的Java应用搭建CI环境,用Jenkins,已经能完成编译但数据库启动不了。试过把Java和MariaDB打包进同一个Docker镜像,但Jenkins用UID 1000用户启动容器时,没法启动需要root权限的MariaDB daemon,脚本卡在启动步骤,没执行到后续命令,导致Jenkins报错。
方案1:拆分容器(推荐,符合Docker最佳实践)
不要把Java构建环境和数据库塞在同一个容器里,拆成两个独立容器:
- 用官方MariaDB镜像启动数据库容器,Jenkins里直接用
docker run或Docker Compose:# 启动MariaDB容器,配置必要环境变量 docker run -d --name ci-mariadb \ -e MYSQL_ROOT_PASSWORD=ci_pass \ -e MYSQL_DATABASE=test_db \ -e MYSQL_USER=ci_user \ -e MYSQL_PASSWORD=ci_user_pass \ mariadb:latest - Java构建容器沿用你原来的eclipse-temurin镜像,通过容器网络连接到
ci-mariadb容器,数据库地址直接填ci-mariadb即可。 - 这种方式职责清晰,官方MariaDB镜像已经处理好权限和启动逻辑,不用自己折腾,而且每次CI都能得到干净的数据库实例。
方案2:修改镜像让非root用户可启动MariaDB(临时场景用)
如果非要把两者放一个镜像,需要调整MariaDB的权限和启动方式:
- 修改Dockerfile:创建并授权数据目录、运行目录给UID 1000
FROM eclipse-temurin:17-jdk-focal RUN apt-get update \ && apt-get install -y git mariadb-client mariadb-server wget \ && apt-get clean \ # 创建必要目录并修改权限 && mkdir -p /var/lib/mysql /var/run/mysqld \ && chown -R 1000:1001 /var/lib/mysql /var/run/mysqld \ && chmod 777 /var/run/mysqld COPY ./docker-entrypoint.sh / ENTRYPOINT ["/docker-entrypoint.sh"] - 修改entrypoint脚本:不用
service命令,直接用mysqld以非root用户启动,同时处理数据库初始化和启动等待:#! /bin/sh # 第一次启动时初始化数据库 if [ ! -d "/var/lib/mysql/mysql" ]; then mysql_install_db --user=1000 --datadir=/var/lib/mysql --skip-name-resolve fi # 后台启动MariaDB mysqld --user=1000 --datadir=/var/lib/mysql --skip-name-resolve & # 等待数据库就绪 until mysqladmin ping -h localhost -u root --silent; do sleep 1 done # 执行Jenkins传递的后续命令 exec "$@"
方案3:让Jenkins以root用户启动容器(不推荐,有安全风险)
直接在Jenkins的Docker运行参数里去掉-u 1000:1001,或者改成-u 0:0(root用户),这样容器内以root身份运行,就能正常执行service mysql start。但这种做法会带来安全隐患,不建议在CI环境中使用。
内容的提问来源于stack exchange,提问作者weertert
相关产品推荐
相关产品推荐

