You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:32:42