Jenkins-运行Docker:COPY失败:stat /var/lib/docker/tmp/docker-builder...: 没有那个文件或目录

3

许多其他问题与此问题有关,我已查看了谷歌搜索中可以找到的所有与此错误消息相关的资源,但它们对我都没有起作用。

我正在使用Jenkins工作来自动构建/推送容器。为此,我使用“执行Shell”构建步骤,并在其中进行所有Docker配置(我尝试使用管道,但这些在我的团队的Jenkins配置中不起作用;请将其视为超出本问题的范畴)。该作业首先克隆一个git仓库(myrepo),然后我有一个shell脚本编写了许多我想包含在Docker容器中的文件(例如run.sh),以及一个Dockerfile。

在构建失败时,我的Jenkins工作区的文件夹结构如下:

|-- myrepo/
|   |-- myexe            # executable file
|   |-- testfiles/
|   |   |-- file1.txt
|   |   |-- file2.txt
|   |   |-- ...
|-- run.sh
|-- Dockerfile

我没有.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上,我在“执行Shell”构建步骤中执行这一切,之前已导入了代码库。我在此步骤中使用echo和输出重定向创建run.sh和Dockerfile。在Jenkins的“执行Shell”构建步骤中执行的shell脚本如下所示:
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命令上失败:
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工作空间中看到它们。我的文件存在于本地 . 目录中,我可以通过在docker build命令之前输入pwdls确认。我没有.dockerignore文件,所以Docker不应该忽略任何内容。但是我肯定错过了什么,因为无论我尝试什么,它仍然无法正常工作。

我忽略了什么?

(Docker版本是Docker version 18.09.7, build 2d0083d)


你尝试过将复制的文件/目录放置在与你的Dockerfile相同的目录中吗?换句话说,尝试cd <path/to/Dockerfile>; cp myrepo/myexe ./。我知道Dockerfiles不能使用COPY命令复制位于Dockerfile目录之外的文件/目录,但我不确定是否也适用于Dockerfile目录中的子目录,因此提出了我的建议。 - Perplexabot
2
我已经尝试过了,实际上(执行了 cp myrepo/myexe myexe 然后在 Dockerfile 中执行了 COPY myexe ...)。不幸的是,它没有起作用。 - Green Cloak Guy
你尝试在独立环境中运行Dockerfile了吗?不要使用Jenkins自动创建,而是手动输入。嘿!我运行了与你的Dockerfile完全相同的副本,出现了相同的错误。有趣。 - Perplexabot
1
兄弟!我删掉了你的注释 # fails on this line,然后一切都正常了。把它删掉再试一次!!! - Perplexabot
1个回答

5
您的评论# fails on this line 是问题所在。 根据 Docker 文档: Docker 把以 # 开头的行视为注释,除非该行是有效的解析器指令。行中任何其他位置的 # 标记都被视为参数。 更多信息请参考:https://docs.docker.com/engine/reference/builder/#format

2
这解决了问题。我很高兴在我的示例中包含了那一部分 - 我的非最小示例中也有行注释。 - Green Cloak Guy
是的,您帖子中提供的信息使得重现变得容易了。 - Perplexabot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接