CircleCI中Docker的MySQL与PHP镜像创建失败问题排查
解决CircleCI配置里的镜像启动报错问题
咱们先逐个拆解你遇到的两个错误,然后给出对应的修复方案:
1. PHP镜像的X11目录创建失败
这个报错$_XSERVTransmkdir: ERROR: euid != 0,directory /tmp/.X11-unix will not be created,本质是因为你用的circleci/php:7.1-apache-node-browsers镜像带了浏览器相关依赖,启动时会尝试创建X11的临时目录,但CircleCI默认用非root的circleci用户跑容器,没权限创建这个目录。
解决办法有两种:
- 如果你不需要浏览器环境(比如不用跑前端自动化测试),可以换成不带
-browsers后缀的PHP镜像,比如circleci/php:7.1-apache-node,直接避开这个问题。 - 如果必须保留浏览器环境,就在job的步骤里先手动创建目录并修改权限,或者在镜像启动命令里提前处理:
比如在docker配置里给PHP镜像加个command:
或者在job的steps里先执行:- image: circleci/php:7.1-apache-node-browsers command: sudo mkdir -p /tmp/.X11-unix && sudo chmod 1777 /tmp/.X11-unix && apache2-foregroundsteps: - run: sudo mkdir -p /tmp/.X11-unix && sudo chmod 1777 /tmp/.X11-unix # 后续步骤...
2. MySQL的root用户创建报错
ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'root'@'%'这个错是因为circleci/mysql:8.0.4镜像默认已经给你创建好root用户了,而且允许从任意主机访问,你再手动执行创建root用户的SQL就会冲突。
另外,CircleCI的MySQL镜像支持用环境变量自动初始化,你不需要手动创建用户:
- 用
MYSQL_ROOT_PASSWORD来设置root用户的密码(你原来写的MYSQL_PASSWORD不对,这个是给普通用户用的) MYSQL_DATABASE会自动帮你创建指定的数据库
所以你需要调整环境变量配置,把MySQL镜像的环境变量改对,同时去掉手动创建root用户的步骤。
修复后的完整配置参考
defaults: &defaults docker: - image: circleci/node:lts-stretch - image: circleci/php:7.1-apache-node-browsers # 提前处理X11目录权限,再启动apache command: sudo mkdir -p /tmp/.X11-unix && sudo chmod 1777 /tmp/.X11-unix && apache2-foreground - image: circleci/mysql:8.0.4 environment: MYSQL_ROOT_PASSWORD: rpgjs_test_password MYSQL_DATABASE: rpgjs_test environment: MYSQL_HOST: 127.0.0.1 MYSQL_DB: rpgjs_test MYSQL_USER: root MYSQL_PASSWORD: rpgjs_test_password working_directory: ~/repo
额外小提示
如果你的测试需要单独的数据库用户,别去碰root用户,创建一个普通用户就行了,记得加IF NOT EXISTS避免重复创建的错误:
CREATE USER IF NOT EXISTS 'test_user'@'%' IDENTIFIED BY 'test_pass'; GRANT ALL PRIVILEGES ON rpgjs_test.* TO 'test_user'@'%'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者enbermudas
相关产品推荐
相关产品推荐

