17

我正在尝试为詹金斯改编一个码头工人版本。我正在关注我们的 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 都有效?如果那不可能,有没有人知道任何替代解决方案?

4

6 回答 6

32

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

我的 Jenkinsfile 中的更新声明是:

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

这允许我的容器在不修改开发人员的 docker-compose 或 Dockerfiles 的预期上下文的情况下构建。

于 2016-08-01T19:52:57.643 回答
1

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

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

    testImage.inside {
        sh 'make test'
    }
}
于 2019-01-02T06:07:52.457 回答
1

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

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

于 2021-02-04T07:21:01.500 回答
1

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

所以使用这个代码

stage('Build') {
        steps {
            dir('/path/to/docker/file/'){ // put the path of Dockerfile
                script{
                    my_images = docker.build("Your_Image")
                }
            }
        }
    }
于 2021-06-09T02:42:20.990 回答
0

只需将context项目 Omnit 打开docker-compose,使其默认为 Dockerfile 的位置。

于 2016-07-31T11:23:57.267 回答
0

以下语法应该有效: docker.build('ContainerTag''-f DockerFilePath Context' 示例:docker.build('quay.io/AppContianer:1.0.0' '-f dockerfileDir/Dockerfile.test dockerfileDir')

于 2018-09-07T09:38:48.243 回答