GitLab CI中如何设置容器主机名与域名,适配MySQL用户授权?
解决方案
要让GitLab CI中执行script的容器使用指定主机名/域名,从而匹配MySQL的权限规则,你可以通过以下两步配置实现:
1. 为Job容器指定主机名
在你的Product-API Job配置中添加hostname字段,直接设置需要的主机名:
Product-API: image: serversideup/php:8.2-fpm-nginx # 指定容器主机名 hostname: hostname.domain.com services: - name: mysql:8.0.33-debian alias: mysql entrypoint: ['/bin/sh', '-c', 'sed -i -e "/^skip-name-resolve/d" /etc/mysql/conf.d/docker.cnf && /usr/local/bin/docker-entrypoint.sh mysqld'] variables: GIT_SUBMODULE_STRATEGY: recursive GIT_SUBMODULE_FORCE_HTTPS: "true" # 启用构建专属网络,确保容器间能解析主机名 FF_NETWORK_PER_BUILD: 1 #mysql variables MYSQL_DATABASE: product_db MYSQL_ROOT_PASSWORD: [nice password] MYSQL_USER: jdoe MYSQL_PASSWORD: [nice password] ... micro services variables before_script: ...download, unpack and load the product database ...install micro service script: # 移除修改用户权限的命令 - mysql -ujdoe -p[nice password] --host=mysql product_db -e 'select 1;'
2. 启用构建专属网络
取消注释FF_NETWORK_PER_BUILD: 1变量,这个特性会为每个Job创建独立的Docker网络,让Job容器和服务容器(比如MySQL)在同一个网络内,互相可以通过主机名解析对方的IP。
原理说明
- 设置
hostname后,执行script的容器会以hostname.domain.com作为自身主机名运行 - 启用专属网络后,MySQL容器能直接解析到Job容器的主机名,当Job容器连接MySQL时,MySQL会通过反向DNS解析获取到
hostname.domain.com,正好匹配你预先在user表中配置的权限规则,无需修改用户的授权范围。
额外注意事项
- 确保你的GitLab Runner使用的是
docker或docker+machine执行器(这是默认的云/自建Runner配置),hostname配置仅对这类执行器生效 - 你已经在MySQL服务的entrypoint中移除了
skip-name-resolve,这是必须的——如果开启这个配置,MySQL会跳过反向DNS解析,直接用IP验证权限,会导致匹配失败
内容的提问来源于stack exchange,提问作者St. Jan
相关产品推荐
相关产品推荐

