特定文件夹中包含Dockerfile的文件

特定文件夹中包含Dockerfile的文件,docker,jenkins,dockerfile,jenkins-pipeline,Docker,Jenkins,Dockerfile,Jenkins Pipeline,这让我抓狂:我试图使用脚本化的Jenkins管道从存储库特定文件夹中的Docker文件构建Docker映像,但它没有得到正确的路径 这是Jenkinsfile中的一行: def customImage = docker.build("km3pipe:${env.BUILD_ID}", "-f ${dockerfile} ${DOCKER_FILES_DIR}") 正如您在下面的Jenkinslog中所看到的,变量已正确解析(我还仔细

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

这是
Jenkinsfile
中的一行:

def customImage = docker.build("km3pipe:${env.BUILD_ID}",
                               "-f ${dockerfile} ${DOCKER_FILES_DIR}")
正如您在下面的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
根据文档(),这应该是可行的:

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

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

node {
    checkout scm
    def dockerfile = 'Dockerfile.test'
    def customImage = docker.build("my-image:${env.BUILD_ID}", "-f ${dockerfile} ./dockerfiles") 
}
生成
my image:${env.BUILD\u ID}
来自
Dockerfile
中的
Dockerfile
可在
/dockerfiles/Dockerfile.test找到


这表示此文件夹中没有名为py365的文件。您是对的docker.build步骤没有使用路径来运行生成

文档遗漏了您必须在dockerfile语句中包含目录的内容:

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

是的,正如我在上面写的。它似乎在工作区目录中查找该文件,正如您在日志中所看到的,而不是在
工作区/dockerfiles
中,它应该在那里……很抱歉,这应该是一个注释。我已经试过了,你是对的,有一个bug,因为它没有使用那个目录来运行docker构建。我使用dir步骤实现了它,只是编辑了答案。非常感谢,这似乎是一个合理的解决方法。然而(我是一个groovy noob),有没有一种方法可以在
dir
闭包之外定义
customImage
?在我输入
目录之前,像
def customImage=''
?我就是这样做的,它工作正常。由于duck类型,不确定它是否好;)我在网上贴了一封你答案的参考信