Докер Jenkins-Run: Сбой копирования: stat / var / lib / docker / tmp / docker-builder ...: нет такого файла или каталога - PullRequest
1 голос
/ 03 июля 2019

Есть много других вопросов о этой проблеме, и я просмотрел каждый ресурс Я могу найти в поиске 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)

1 Ответ

3 голосов
/ 03 июля 2019

Ваш комментарий # fails on this line - это проблема. Согласно документации Docker:

Docker рассматривает строки, начинающиеся с #, как комментарий, если строка не действительная директива парсера. Маркер # в любом месте строки рассматривается как аргумент.

Подробнее здесь: https://docs.docker.com/engine/reference/builder/#format

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...