如何构建含Ubuntu、Python、Redis、MySQL的镜像用于GitLab CI单元测试?
构建含Ubuntu/Python/Redis/MySQL的镜像并在GitLab CI中运行单元测试
1. 编写Dockerfile
基于Ubuntu 22.04构建包含所需环境的镜像,同时完成MySQL和Redis的初始化配置:
FROM ubuntu:22.04 # 禁用交互模式,避免安装过程中弹出提示 ENV DEBIAN_FRONTEND=noninteractive # 测试用MySQL配置 ENV MYSQL_ROOT_PASSWORD=testpass ENV MYSQL_DATABASE=test_db # 更新系统并安装依赖包 RUN apt-get update && apt-get install -y \ python3 \ python3-pip \ redis-server \ mysql-server \ && rm -rf /var/lib/apt/lists/* # 修改MySQL配置,允许远程连接(CI环境中需要) RUN sed -i 's/^bind-address\s*=.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf RUN echo "mysqlx-bind-address = 0.0.0.0" >> /etc/mysql/mysql.conf.d/mysqld.cnf # 初始化MySQL:创建测试库,允许root远程访问 RUN service mysql start && \ mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "CREATE DATABASE IF NOT EXISTS ${MYSQL_DATABASE};" && \ mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' WITH GRANT OPTION;" && \ mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "FLUSH PRIVILEGES;" # 复制服务启动脚本 COPY start_services.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/start_services.sh # 暴露服务端口 EXPOSE 3306 6379 # 默认执行启动脚本 CMD ["start_services.sh"]
配套服务启动脚本(start_services.sh)
由于Docker默认仅运行单个进程,用脚本同时启动MySQL和Redis:
#!/bin/bash # 启动MySQL服务 service mysql start # 后台启动Redis redis-server --daemonize yes # 保持容器运行(CI中运行测试时可替换为测试命令,这里用于镜像默认启动) tail -f /dev/null
2. 编写GitLab CI配置文件(.gitlab-ci.yml)
分为构建推送镜像和运行单元测试两个阶段:
stages: - build - test # 全局变量:使用GitLab内置Registry存储镜像 variables: DOCKER_REGISTRY: $CI_REGISTRY IMAGE_NAME: $CI_REGISTRY_IMAGE/test-env IMAGE_TAG: $CI_COMMIT_SHA # 构建并推送镜像到GitLab Registry build-image: stage: build image: docker:latest services: - docker:dind before_script: # 登录GitLab Registry - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - docker build -t $IMAGE_NAME:$IMAGE_TAG . - docker push $IMAGE_NAME:$IMAGE_TAG # 拉取镜像并运行单元测试 run-tests: stage: test image: $IMAGE_NAME:$IMAGE_TAG before_script: # 验证服务状态 - service mysql status - redis-cli ping # 若Python依赖未提前打包进镜像,可在此安装 # - pip3 install --no-cache-dir -r requirements.txt script: # 替换为你的单元测试执行命令,例如pytest - python3 -m pytest tests/ -v
关键注意事项
- GitLab Registry配置:确保项目已启用GitLab容器Registry,内置变量
CI_REGISTRY、CI_REGISTRY_USER、CI_REGISTRY_PASSWORD会自动注入,无需手动配置。 - MySQL安全:镜像中设置的
testpass是测试用密码,生产环境需严格保密并修改配置。 - 测试代码适配:单元测试中需使用对应连接信息:MySQL主机
localhost、密码testpass、数据库test_db;Redis主机localhost、默认端口6379。 - 镜像优化:若需减小镜像体积,可在安装后清理apt缓存,或使用多阶段构建分离构建环境与运行环境。
内容的提问来源于stack exchange,提问作者lornejad
相关产品推荐
相关产品推荐

