如何在 jenkinsfile 中为 docker.build 设置自定义上下文
How to set custom context for docker.build in jenkinsfile
我正在尝试为 jenkins 调整 docker 构建。我正在关注我们的 docker-compose 文件,我正在创建一个 Jenkinsfile,它正在创建每个容器并将它们链接在一起。我遇到的问题 运行 是 docker-compose 文件声明的上下文不在 Dockerfile 所在的位置。据我了解,jenkins 会将上下文设置为 Dockerfile 所在的位置,这会将文件复制到不同的相对位置,具体取决于 jenkinsfile 或 docker-compose 文件是否正在构建。
文件夹结构为:
workspace
|-docker
|-db
|-Dockerfile
|-entrypoint.sh
这就是 Dockerfile 为相关文件声明 COPY 指令的方式
COPY docker/db/entrypoint.sh /
这就是我的 jenkinsfile 构建文件的方式。据我所知将上下文放在该目录中
docker.build("db", "${WORKSPACE}/docker/db")
docker-compose 文件声明如下:
db:
build:
context: .
dockerfile: docker/db/Dockerfile
将上下文置于项目的根目录。
有什么方法可以告诉 jenkinsfile 使用与 docker-compose 文件相同的上下文,以便 Dockerfile 的 COPY 指令可以保持不变并且对 Jenkins 和 docker-compose 都有效?如果那不可能,有人知道任何替代解决方案吗?
只需忽略 docker-compose
上的 context
项,使其默认为 Dockerfile 的位置。
原来我拉的是 docker-pipeline-plugin 的旧版本 (1.6)。有问题的函数已经更新 (1.7) 以允许第二个参数指定上下文之外的 Dockerfile 位置。
我的 Jenkinsfile 中的更新语句是:
return docker.build("db", "-f docker/db/Dockerfile .")
这允许我的容器在不修改开发人员的 docker-compose 或 Dockerfile 的预期上下文的情况下构建。
以下语法应该有效:
docker.build('ContainerTag''-f DockerFilePath上下文'
示例:docker.build('quay.io/AppContianer:1.0.0' '-f dockerfileDir/Dockerfile.test dockerfileDir')
build()方法默认在当前目录下构建Dockerfile。这可以通过提供包含 Dockerfile 的目录路径作为 build() 方法的第二个参数来覆盖,例如:
node {
checkout scm
def testImage = docker.build("test-image", "./dockerfiles/test")
testImage.inside {
sh 'make test'
}
}
要指定 dockerfile 的路径,dir{} 块对我有用
stage('docker build') {
steps {
dir('/path/to/docker/file/'){
script{
dockerImage = docker.build("imageName")
}
}
}
}
最好的方法是使用 dir 块,因为您需要执行复制等操作,您必须在该位置
所以使用这个代码
stage('Build') {
steps {
dir('/path/to/docker/file/'){ // put the path of Dockerfile
script{
my_images = docker.build("Your_Image")
}
}
}
}
我正在尝试为 jenkins 调整 docker 构建。我正在关注我们的 docker-compose 文件,我正在创建一个 Jenkinsfile,它正在创建每个容器并将它们链接在一起。我遇到的问题 运行 是 docker-compose 文件声明的上下文不在 Dockerfile 所在的位置。据我了解,jenkins 会将上下文设置为 Dockerfile 所在的位置,这会将文件复制到不同的相对位置,具体取决于 jenkinsfile 或 docker-compose 文件是否正在构建。
文件夹结构为:
workspace
|-docker
|-db
|-Dockerfile
|-entrypoint.sh
这就是 Dockerfile 为相关文件声明 COPY 指令的方式
COPY docker/db/entrypoint.sh /
这就是我的 jenkinsfile 构建文件的方式。据我所知将上下文放在该目录中
docker.build("db", "${WORKSPACE}/docker/db")
docker-compose 文件声明如下:
db:
build:
context: .
dockerfile: docker/db/Dockerfile
将上下文置于项目的根目录。
有什么方法可以告诉 jenkinsfile 使用与 docker-compose 文件相同的上下文,以便 Dockerfile 的 COPY 指令可以保持不变并且对 Jenkins 和 docker-compose 都有效?如果那不可能,有人知道任何替代解决方案吗?
只需忽略 docker-compose
上的 context
项,使其默认为 Dockerfile 的位置。
原来我拉的是 docker-pipeline-plugin 的旧版本 (1.6)。有问题的函数已经更新 (1.7) 以允许第二个参数指定上下文之外的 Dockerfile 位置。
我的 Jenkinsfile 中的更新语句是:
return docker.build("db", "-f docker/db/Dockerfile .")
这允许我的容器在不修改开发人员的 docker-compose 或 Dockerfile 的预期上下文的情况下构建。
以下语法应该有效: docker.build('ContainerTag''-f DockerFilePath上下文' 示例:docker.build('quay.io/AppContianer:1.0.0' '-f dockerfileDir/Dockerfile.test dockerfileDir')
build()方法默认在当前目录下构建Dockerfile。这可以通过提供包含 Dockerfile 的目录路径作为 build() 方法的第二个参数来覆盖,例如:
node {
checkout scm
def testImage = docker.build("test-image", "./dockerfiles/test")
testImage.inside {
sh 'make test'
}
}
要指定 dockerfile 的路径,dir{} 块对我有用
stage('docker build') {
steps {
dir('/path/to/docker/file/'){
script{
dockerImage = docker.build("imageName")
}
}
}
}
最好的方法是使用 dir 块,因为您需要执行复制等操作,您必须在该位置
所以使用这个代码
stage('Build') {
steps {
dir('/path/to/docker/file/'){ // put the path of Dockerfile
script{
my_images = docker.build("Your_Image")
}
}
}
}