我正在使用Jenkins作业来自动化容器的构建/推送。为此,我使用“ Execute Shell”构建步骤,并在内部进行所有Docker配置(我尝试使用管道,但是这些操作在我团队的Jenkins配置中不起作用;请在这个问题的范围)。这项工作首先克隆了一个git仓库(myrepo),然后我有一个shell脚本编写了一些我想包含在Docker容器(例如run.sh)中的文件以及一个Dockerfile。
myrepo
run.sh
构建失败时,我的Jenkins工作区的文件夹结构如下:
|-- myrepo/ | |-- myexe # executable file | |-- testfiles/ | | |-- file1.txt | | |-- file2.txt | | |-- ... |-- run.sh |-- Dockerfile
我没有.dockerignore档案。
.dockerignore
在构建失败时,Dockerfile如下所示:
FROM centos USER root # create directories RUN mkdir -p /opt/dir1/myexe # copy shell script COPY run.sh /usr/bin/runprog # copy executable COPY myrepo/myexe /opt/dir1/myexe/ # fails on this line COPY myrepo/testfiles /opt/dir1/myexe/ # final setup WORKDIR /opt/dir1/myexe/ CMD ["/opt/dir1/myexe/myexe"]
现在,在Jenkins上,在较早导入了仓库之后,我将在“ Execute Shell”构建步骤中执行所有这些操作。我创建run.sh并Dockerfile在此步骤中使用echo和输出重定向。在詹金斯的“执行外壳”构建步骤中执行的外壳脚本如下所示:
Dockerfile
echo
echo '#!/bin/sh ... ' > run.sh echo 'FROM centos ... ' > Dockerfile docker system prune -af docker images # I can confirm from logs that no images remain docker build -t containername:${DOCKER_IMAGE_TAG} .
但是当我运行此docker build命令时,该命令的构建失败:
docker build
Step 5/8 : COPY myrepo/myexe /opt/dir1/myexe COPY failed: stat /var/lib/docker/tmp/docker-builder190297994/opt/dir1/myexe: no such file or directory
我见过的其他所有问题均未提供有助于解决问题的解决方案。我的文件在本地存在,构建失败后可以在Jenkins工作区中看到。我的文件存在于本地 的.目录,我可以通过将确认pwd并ls不仅仅是之前docker build的命令。我没有.dockerignore文件,因此Docker不应该忽略任何东西。但是我必须丢失一些东西,因为无论我想尝试什么,它仍然无法正常工作。
.
pwd
ls
我在俯视什么?
(Docker版本为Docker version 18.09.7, build 2d0083d)
Docker version 18.09.7, build 2d0083d
您的评论# fails on this line就是问题。根据Docker文档:
# fails on this line
Docker会将以#开头的行视为注释,除非该行是有效的解析器指令。一行中其他任何地方的#标记均被视为参数。
此处的更多信息:https : //docs.docker.com/engine/reference/builder/#format