如何在jenkinsfile中为docker.build设置自定义上下文

时间:2016-07-29 18:24:28

标签: docker jenkins-pipeline jenkinsfile

我正在尝试为jenkins调整docker构建。我正在关注我们的docker-compose文件,并且我正在创建一个创建每个容器并将它们链接在一起的Jenkins文件。我遇到的问题是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都有效?如果那不可能,有没有人知道任何其他解决方案?

6 个答案:

答案 0 :(得分:21)

事实证明我正在推动docker-pipeline-plugin的先前版本(1.6)。有问题的函数已经更新(1.7),允许第二个参数指定上下文之外的Dockerfile位置。

我的Jenkins文件中的更新语句是:

return docker.build("db", "-f docker/db/Dockerfile .")

这样就可以在不修改开发人员的docker-compose或Dockerfiles的预期上下文的情况下构建容器。

答案 1 :(得分:1)

要指定 dockerfile 的路径,dir{} 块对我有用

stage('docker build') {
            steps {
                dir('/path/to/docker/file/'){
                    script{
                        dockerImage = docker.build("imageName")
                    }
                }
            }
        }

答案 2 :(得分:1)

最好的方法是使用 dir 块,因为您需要执行 COPY 之类的操作,您必须在该位置中

所以使用此代码

stage('Build') {
        steps {
            dir('/path/to/docker/file/'){ // put the path of Dockerfile
                script{
                    my_images = docker.build("Your_Image")
                }
            }
        }
    }

答案 3 :(得分:0)

只需对context上的docker-compose项进行Omnit,这样它就默认为Dockerfile的位置。

答案 4 :(得分:0)

以下语法应该起作用: docker.build('ContainerTag'-f DockerFilePath上下文' 示例:docker.build('quay.io/AppContianer:1.0.0''-f dockerfileDir / Dockerfile.test dockerfileDir')

答案 5 :(得分:0)

build()方法默认在当前目录中构建Dockerfile。可以通过提供包含Dockerfile的目录路径作为build()方法的第二个参数来覆盖它,例如:

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

    testImage.inside {
        sh 'make test'
    }
}