Я пытаюсь создать новый образ Docker для нашего процесса разработки, используя cpanm
для установки несколько модулей Perl в качестве базового образа для различных проектов.
При разработке Dockerfile cpanm
возвращает код ошибки, потому что некоторые модули были установлены неправильно.
Я уверен, что мне нужно apt
установить еще кое-что.
У меня вопрос, где я могу найти /.cpanm/work
каталог, указанный в выходных данных, чтобы проверить журналы? В общем случае, как я могу проверить файловую систему неудачной docker build
команды?
Утро править После прикуса пули и запуска find
я обнаружил
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
Это надежно, или мне лучше собрать «голый» контейнер и запускать вещи вручную, пока у меня не будет всего, что мне нужно?
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
тех внутреннихОтветы:
Каждый раз, когда docker успешно выполняет
RUN
команду из Dockerfile, фиксируется новый слой в файловой системе образа . Удобно использовать идентификаторы этих слоев в качестве изображений для запуска нового контейнера.Возьмите следующий Dockerfile:
и построить это:
Теперь вы можете создать новый контейнер с
00f017a8c2a6
,044e1532c690
и5bd8172529c1
:Конечно, вы можете запустить оболочку для изучения файловой системы и попробовать команды:
В случае сбоя одной из команд Dockerfile вам нужно найти идентификатор предыдущего уровня и запустить оболочку в контейнере, созданном из этого идентификатора:
Однажды в контейнере:
Если вам действительно нужно поэкспериментировать с реальным слоем, который вышел из строя, а не работать с последним рабочим слоем, см . Ответ Дрю .
источник
docker run --rm -it <id_last_working_layer> bash -il
и, попав в контейнер, попробовать команду, которая не смогла воспроизвести проблему, затем исправьте команду и протестируйте ее, наконец обновите ваш Dockerfile с помощью фиксированной команды.docker diff <container>
и получить полный список конкретных изменений файловой системы, внесенных в этот конкретный слой (файлы, добавленные, удаленные или измененные во всей файловой системе для этого образа).Unable to find image 'd5219f1ffda9:latest' locally
. Тем не менее, я был смущен несколькими видами удостоверений личности. Оказывается, вы должны использовать идентификаторы, которые следуют непосредственно за стрелками, а не те, которые говорят "Running in ...".Верхний ответ работает в том случае, если вы хотите проверить состояние непосредственно перед неудачной командой.
Однако возникает вопрос, как проверить состояние самого сбойного контейнера. В моей ситуации сбойная команда - это сборка, которая занимает несколько часов, поэтому перемотка перед неудачной командой и ее повторный запуск занимает много времени и не очень полезна.
Решение здесь состоит в том, чтобы найти контейнер, который потерпел неудачу:
Передайте это изображению:
А затем запустите образ [при необходимости, запустив bash]:
Теперь вы на самом деле смотрите на состояние сборки во время ее сбоя, а не перед тем, как запустить команду, вызвавшую сбой.
источник
DOCKER_BUILDKIT=1
для созданияDockerfile
Docker кэширует все состояние файловой системы после каждой успешной
RUN
строки.Знаю это:
RUN
ошибочной командой, закомментируйте ее в Dockerfile (а также любые и все последующиеRUN
команды), затем запуститеdocker build
иdocker run
снова.RUN
команды, просто добавьте|| true
к нему, чтобы заставить его преуспеть; затем действуйте, как описано выше (оставьте все последующиеRUN
команды закомментированными, запуститеdocker build
иdocker run
)Тада, нет необходимости связываться с внутренностями Docker или идентификаторами слоев, и в качестве бонуса Docker автоматически минимизирует объем работы, который необходимо сделать заново.
источник
Отладка сбоев на этапе сборки действительно очень раздражает.
Лучшее решение, которое я нашел, состоит в том, чтобы убедиться, что каждый шаг, который выполняет реальную работу, успешен, и добавив проверку после тех, которые терпят неудачу. Таким образом, вы получаете зафиксированный слой, который содержит результаты неудачного шага, которые вы можете проверить.
Dockerfile, с примером после
# Run DB2 silent installer
строки:источник
То, что я хотел бы сделать, это прокомментировать Dockerfile ниже и включая строку обидчика. Затем вы можете запустить контейнер и запустить команды docker вручную, а также просмотреть журналы обычным способом. Например, если Dockerfile
и он умирает в баре, я бы сделал
затем
источник