【问题标题】:Docker file with jenkins arficacty copy problem带有jenkins arficacty复制问题的Docker文件
【发布时间】:2020-08-09 05:01:10
【问题描述】:

请参阅下面的 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"
            }
        }
    }
}

【问题讨论】:

  • war文件是否存在于您指定的/build/...目录下的同一个slave中?您是否缺少正斜杠/build/libs/demo.war

标签: docker jenkins dockerfile jenkins-pipeline jenkins-groovy


【解决方案1】:

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

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

使用 Dockerfile

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

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

构建容器

为了创建 Docker 镜像,Docker Pipeline 插件也 提供了一个 build() 方法,用于从 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'
    }
}

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

请注意,您现在应该可以参考to the built artifact in the previous steps

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

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

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

【讨论】:

    猜你喜欢
    • 2017-08-08
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多