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

Docker容器卷映射问题:如何将测试结果同步至Jenkins容器

问题分析与解决方案

现有配置的核心错误

  1. 文件名不匹配:Jenkinsfile中docker run卷映射的是result.json,但测试容器实际生成的是result.xml,导致映射无效。
  2. 容器生命周期冲突:使用--rm参数启动测试容器,容器运行完成后立即销毁,后续docker cp命令无法找到目标容器。
  3. 卷映射逻辑错误:Jenkins容器与测试容器的/app目录未通过宿主机或共享卷关联,直接容器间的路径映射不生效。

修复方案:使用宿主机共享目录同步测试结果

通过宿主机目录作为中间层,让测试容器将结果写入宿主机,再由Jenkins容器读取。

步骤1:修改Jenkins容器启动脚本

新增宿主机目录映射到Jenkins容器的测试结果目录:

$USER = Read-Host -Prompt "Provide username: "
$PASSWORD = Read-Host -Prompt "Provide password: "

docker login --username $USER --password $PASSWORD
docker build -t test/jenkins_with_python:1 .
docker push test/jenkins_with_python:1
docker rmi test/jenkins_with_python:1
docker pull test/jenkins_with_python:1
# 新增测试结果目录映射
docker run --rm --privileged -d -p 8080:8080 -p 50000:50000 `
  -v C:\directory\JenkinsOutput/jenkins:/var/jenkins_home `
  -v C:\directory\JenkinsOutput/test-results:/var/jenkins_home/test-results `
  -v //var/run/docker.sock:/var/run/docker.sock `
  test/jenkins_with_python:1

步骤2:修改Jenkinsfile

调整测试容器启动命令,将结果写入共享目录,移除无效的docker cp:

pipeline {
    agent any

    stages {
        stage("Running unit tests") {
            steps {
                sh "docker login --username <username> --password <password>"
                sh "docker pull test/calculator_pytests:1"
                # 将测试结果写入共享目录
                sh "docker run --rm -v /var/jenkins_home/test-results:/app/test-results test/calculator_pytests:1 sh -c '. venv/bin/activate && pytest -v --junit-xml=/app/test-results/result.xml'"
            }

            post {
                always {
                    # 读取共享目录中的测试结果
                    junit testResults: '/var/jenkins_home/test-results/*.xml'
                }
            }
        }

        stage("Running calculator app") {
            steps {
                sh "python3 ./calculator/calculator.py"
            }
        }
    }
}

步骤3:可选优化测试容器Dockerfile

提前创建结果目录并固定输出路径:

FROM python:latest

WORKDIR /app

COPY requirements.txt .

RUN python3 -m pip install --upgrade pip &&    \
    python3 -m venv venv && \
    . venv/bin/activate && \
    pip3 install -r "requirements.txt"

COPY . .

RUN rm "requirements.txt"
# 提前创建结果目录
RUN mkdir -p /app/test-results
# 固定结果输出路径
CMD ["sh", "-c", ". venv/bin/activate && pytest -v --junit-xml=/app/test-results/result.xml"]

替代方案:使用Docker命名卷

无需依赖宿主机目录,用Docker命名卷实现容器间共享:

  1. 创建命名卷:docker volume create test-results
  2. 修改Jenkins容器启动命令:添加-v test-results:/var/jenkins_home/test-results
  3. 修改Jenkinsfile的docker run命令:添加-v test-results:/app/test-results

这种方式由Docker管理卷,适合跨平台场景。


内容的提问来源于stack exchange,提问作者Tojmak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:13:13