Есть много других вопросов о этой проблеме, и я просмотрел каждый ресурс Я могу найти в поиске Google об этом сообщении об ошибке, но ни одно из них не помогло мне.
Я использую задание Jenkins для автоматизации сборки / отправки контейнера. Для этого я использую шаг сборки «Execute Shell» и выполняю все свои настройки Docker внутри (я пробовал использовать конвейер, но они просто не работают в конфигурации Jenkins моей команды; рассмотрим их вне Сфера этого вопроса). Задание сначала клонирует репозиторий git (myrepo
), а затем у меня есть сценарий оболочки, записывающий ряд файлов, которые я хочу включить в контейнер Docker (например, run.sh
), а также файл Dockerfile.
Структура папок моего рабочего пространства Jenkins выглядит следующим образом к моменту сбоя сборки:
|-- myrepo/
| |-- myexe # executable file
| |-- testfiles/
| | |-- file1.txt
| | |-- file2.txt
| | |-- ...
|-- run.sh
|-- Dockerfile
У меня нет .dockerignore
файла.
Файл Docker к моменту сбоя сборки выглядит следующим образом:
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
и перенаправление вывода. Сценарий оболочки, выполняемый на этапе сборки Jenkins «Execute 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 после сбоя сборки. Мои файлы существуют локально в каталоге .
, что я могу подтвердить, поставив pwd
и ls
непосредственно перед командой docker build
. У меня нет файла .dockerignore
, поэтому Docker не должен ничего игнорировать. Но я, должно быть, что-то упускаю, потому что это все равно не работает, что бы я ни пытался попробовать.
Что я пропускаю?
(версия Docker Docker version 18.09.7, build 2d0083d
)