Jenkinsfile 和 Dockerfile 位于特定文件夹中

tam*_*gal 3 jenkins docker dockerfile jenkins-pipeline

这让我抓狂:我尝试使用脚本化 Jenkins Pipeline 从存储库的特定文件夹中的 Dockerfile 构建 Docker 映像,但它没有获得正确的路径。

这是以下行Jenkinsfile

def customImage = docker.build("km3pipe:${env.BUILD_ID}",
                               "-f ${dockerfile} ${DOCKER_FILES_DIR}")
Run Code Online (Sandbox Code Playgroud)

正如您在下面的 Jenkinslog 中看到的,变量已正确解析(我还仔细检查了工作区,一切都很好),但它似乎忽略了第二个参数.dockerfiles

[py365] + docker build -t km3pipe:13 -f py365 ./dockerfiles
[py365] unable to prepare context: unable to evaluate symlinks in Dockerfile path: 
        lstat /var/lib/jenkins/workspace/f-docker-image-names-for-ci-2DCL5RJ7AMH7K
        IB6OCBTD57EC5DUGYZTQE5EQ6KGOSPXMUOVJP6Q/py365: no such file or directory
Run Code Online (Sandbox Code Playgroud)

根据文档(https://jenkins.io/doc/book/pipeline/docker/),这应该有效:

可以通过将其他参数添加到方法的第二个参数来将其他参数传递给 docker build build()。以这种方式传递参数时,该字符串中的最后一个值必须是 docker 文件的路径。

Dockerfile此示例通过传递 -f 标志来覆盖默认值:

node {
    checkout scm
    def dockerfile = 'Dockerfile.test'
    def customImage = docker.build("my-image:${env.BUILD_ID}", "-f ${dockerfile} ./dockerfiles") 
}
Run Code Online (Sandbox Code Playgroud)

my-image:${env.BUILD_ID}Dockerfile在 处找到的内容构建./dockerfiles/Dockerfile.test

Ign*_*lán 5

意思是这个文件夹中没有名为 py365 的文件。你是对的,docker.build 步骤没有使用路径来运行构建。

该文档忽略了您必须在 dockerfile 语句中包含该目录:

def customImage = docker.build("km3pipe:${env.BUILD_ID}",
                               "-f ${DOCKER_FILES_DIR}/${dockerfile} ${DOCKER_FILES_DIR}")
Run Code Online (Sandbox Code Playgroud)