Как разрешить "Не удается получить.Id от докера" при создании изображения Docker с использованием Jenkins
Я использую конвейер Jenkins для создания файла Docker.
Файл docker успешно проходит все этапы и создает изображение докеров.
Как показано:
Step 16/19 : FROM base AS final
---> <id>
Step 17/19 : WORKDIR /app
---> Using cache
---> <id>
Step 18/19 : COPY --from=publish /app .
---> Using cache
---> <id>
Step 19/19 : ENTRYPOINT ["", "myapp.dll"]
---> Using cache
---> <id>
Successfully built cb3y81938e88
Successfully tagged myapp:latest
Однако после этого оболочка не работает со следующей ошибкой:
java.io.IOException: Cannot retrieve .Id from 'docker inspect base AS final'
Почему она бросает эту ошибку, несмотря на успешное построение изображения докера? Когда я выполняю это на своей локальной машине, команда завершает работу над "Успешно помеченным myapp: последним",
Моя версия докера - 18.03.1-ce.
Любая помощь по этому вопросу будет принята с благодарностью!
Ответы
Ответ 1
Кажется, в этом плагине Jenkins есть ошибка.
Вы можете попробовать удалить имя многоэтапной сборки (" AS final
", если вам это не нужно):
FROM base
(....)
Но если вам действительно нужно сослаться на предыдущее построенное изображение (многоэтапное), обходной путь может использовать --copy-from 0
(0,1,2, как это соответствует, вместо имени псевдонима)
Связанные проблемы в Дженкинс
редактировать
Документирование здесь решения, найденного ОП:
Я получил эту работу, не используя файл конвейера Jenkinsfile, а вместо этого выполняя Shell в задании Jenkins для выполнения команды сборки Docker. (Docker build -t последняя сборка.)
Ответ 2
Я получаю эту проблему, потому что я использую --target=<foo>
чтобы построить свой образ только до определенной точки.
Так что мой Dockerfile выглядит так
FROM maven:3.6-jdk-8 AS BUILD
.. do build ..
FROM openjdk:8
COPY --from=BUILD /myapp/bin my_jar_file
И моя сборка с помощью docker.build(<tag>, "--target=BUILD.")
неудачно с:
java.io.IOException: Cannot retrieve .Id from 'docker inspect openjdk:8'
Это связано с тем, что Дженкинс пытается проверить второй FROM openjdk:8
в Dockerfile, а также потому, что эта цель не запускалась, Docker не снимал этот образ и недоступен для docker inspect
У меня есть куча обходных путей:
- Убедитесь, что образ в любом случае доступен, выполнив
docker pull openjdk:8
перед docker pull openjdk:8
- Удалить
--target=BUILD
из моей команды docker.build
и позволить ему собрать все целиком (не так уж и сложно для меня, так как сборка - самая дорогая часть) - Избегайте использования
docker.build
и просто sh "docker build --target=BUILD.
На данный момент я не уверен, с кем я пойду
Ответ 3
Я столкнулся с той же проблемой с Docker 18.09, но я не использовал многоэтапную сборку. В моем случае я получал:
java.io.IOException: Cannot retrieve .Id from 'docker inspect centos:7'
Первый шаг в моем Dockerfile был:
FROM centos:7
Мне удалось решить проблему с docker pull centos:7
; после этого сборка Jenkins была успешно завершена.
Ответ 4
В моей конкретной ситуации у моих jenkins было два узла: главный и подчиненный. Когда задание запускается на подчиненном узле, задание не выполняется. При запуске на главном узле задание выполнено успешно.
Как запустить задание jenkins на определенном узле, используя Jenkinsfile? Пример:
node('master') {}
Ответ 5
Ни одна из вышеперечисленных идей не работает для моего случая, и я наконец-то получил работу, как показано ниже, не изменяя ничего в Dockerfile:
- Жесткий код тега сборки типа "последний",
- Получите свой собственный тег через sh,
- Сначала нажмите на изображение с помощью жестко закодированного тега,
- Нажмите на изображение еще раз с вашим индивидуальным тегом.
def my_own_tag = "unknown"
my_own_tag = sh ( script: 'git tag | tail -n1', returnStdout: true ).trim()
docker_img = docker.build("latest")
docker_img.push("latest")
docker_img.push("${my_own_tag}")