Как разрешить "Не удается получить.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

У меня есть куча обходных путей:

  1. Убедитесь, что образ в любом случае доступен, выполнив docker pull openjdk:8 перед docker pull openjdk:8
  2. Удалить --target=BUILD из моей команды docker.build и позволить ему собрать все целиком (не так уж и сложно для меня, так как сборка - самая дорогая часть)
  3. Избегайте использования 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:

  1. Жесткий код тега сборки типа "последний",
  2. Получите свой собственный тег через sh,
  3. Сначала нажмите на изображение с помощью жестко закодированного тега,
  4. Нажмите на изображение еще раз с вашим индивидуальным тегом.
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}")