docker - 带有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"
}
}
}
}
解决方案
我认为您混合了两个 Jenkins 管道功能:
- 借助 Dockerfile 为 Docker 代理自定义 Docker 执行环境
使用 Dockerfile
对于需要更多自定义执行环境的项目,Pipeline 还支持从源存储库中的 Dockerfile 构建和运行容器。与之前使用“现成”容器的方法相比,使用该
agent { dockerfile true }
语法将从 Dockerfile 构建新镜像,而不是从 Docker Hub 中提取镜像。
- 从 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 .'
}
}
推荐阅读
- python - docker-compose 文件配置
- amazon-web-services - 适用于 Cloud Trail 放置事件选择器的 AWS 云形成
- powershell - azure devOps 管道中的 Powershell 脚本
- qb64 - 玩家精灵在按住移动键时移动而无需输入
- python - 是否可以使用内置的 LogEntry 来跟踪每个用户的操作,而不仅仅是在管理页面中?
- python-3.x - 分割掩码的倒置像素坐标
- .net - 如何在表单之外显示工具提示
- java - 使用“pkexec”打开 .jar 文件并使用桌面条目运行命令
- php - 我想问为什么我对空值列的查询导致空值?
- sql - 基于 SQL 查询的 Powershell 重命名文件