首页 > 解决方案 > 带有jenkins arficacty复制问题的Docker文件

问题描述

请参阅下面的 Jenkinsfile 和 Dockerfile。我正在尝试构建然后将我的 .war 文件添加到我在 jenkins 中创建的 docker 映像中。但这给了我错误COPY failed: stat /var/lib/docker/tmp/docker-builder785780968/build/libs/demo.war: no such file or directory。我独立测试了我的 Dockerfile,它工作正常,但 jenkins 找不到我的战争的位置。我怎样才能指出詹金斯在哪里看?谢谢。

//Dockerfile

FROM tomcat:jdk8-openjdk
WORKDIR /usr/local/tomcat/webapps
ADD build/libs/demo.war /usr/local/tomcat/webapps/. #Fails here due to location of cant find war
WORKDIR /usr/local/tomcat
ENV CATALINA_OPTS "-Xmx512m -Xms256m"
CMD ["catalina.sh", "run"]

//Jenkinsfile

#!groovy

pipeline{
    agent any

    stages{
        stage('Build'){
            steps{
                sh "./gradlew --no-daemon build"
            }
        }

        stage('Unit Test'){
          steps{
            sh "./gradlew --no-daemon test"
            }
        }

        stage('Docker Image'){
            agent{
                dockerfile true
            }
            steps{
                echo "docker complete"
            }
        }
    }
}

标签: dockerjenkinsdockerfilejenkins-pipelinejenkins-groovy

解决方案


我认为您混合了两个 Jenkins 管道功能:

  1. 借助 Dockerfile 为 Docker 代理自定义 Docker 执行环境

使用 Dockerfile

对于需要更多自定义执行环境的项目,Pipeline 还支持从源存储库中的 Dockerfile 构建和运行容器。与之前使用“现成”容器的方法相比,使用该agent { dockerfile true }语法将从 Dockerfile 构建新镜像,而不是从 Docker Hub 中提取镜像。

  1. 从 Dockerfile 构建应用程序的 Docker 映像

构建容器

为了创建 Docker 镜像,Docker Pipeline 插件还提供了一个 build() 方法,用于在 Pipeline 运行期间从存储库中的 Dockerfile 创建新镜像。

(个人注:Building containers标题应该是 Building images

您需要第二个,因为您将构建的 WAR 复制到 Dockerfile 中,但您使用了第一个。


从 Dockerfile 构建 docker 映像的示例(来自文档):

node {
    checkout scm
    def testImage = docker.build("test-image", "./dockerfiles/test") 

    testImage.inside {
        sh 'make test'
    }
}

在这里,它test-image从位于./dockerfiles/test/Dockerfile.
请注意,该docker.build方法返回一个表示图像的对象。这可能有助于将其推送到 Docker 注册表、将其复制到机器上或在下一步中运行它。

请注意,您现在应该能够参考前面步骤中构建的工件

当 Jenkins 检测到代理本身在 Docker 容器内运行时,它会自动将 --volumes-from 参数传递给内部容器,确保它可以与代理共享工作空间。

如果 jenkins 是作为容器启动的,并且安装的卷是主机的 docker 套接字,则可以使用更直接的方法来使用管道的当前上下文构建映像:

stage('Docker Build') {
   agent any
   steps {
     sh 'docker build -f your-dockerfile -t your-tag .'
   }
 }

推荐阅读