У меня была проблема с контейнером, хотя он прекрасно собирается, но не запускается должным образом. Причина - это обходной путь, который я добавил в Dockerfile (для того, чтобы иметь самонастраиваемую маршрутизацию / etc / hosts)
RUN mkdir -p -- /lib-override /etc-override && cp /lib/libnss_files.so.2 /lib-override
ADD hosts.template /etc-override/hosts
RUN perl -pi -e 's:/etc/hosts:/etc-override/hosts:g' /lib-override/libnss_files.so.2
ENV LD_LIBRARY_PATH /lib-override
Очевидно, что там есть какая-то ошибка, но мне интересно, как я могу получить больше информации о том, что делает докер во время работы. например, это работает:
$ docker run image ls
usr bin ...
Но это не так:
$ docker run image ls -l
$
В логах ничего нет, и я не могу вызвать интерактивную оболочку. Я могу использовать strace, чтобы увидеть, что происходит, но я надеялся, что есть лучший способ.
Можно ли как-нибудь настроить docker на более подробный?
РЕДАКТИРОВАТЬ : Благодаря Эндрю Д. Теперь я знаю, что не так с кодом выше (я оставил его, чтобы его ответ можно было понять). Сейчас этот вопрос еще как я мог отлаживать что - то вроде этого , или получить некоторые внутренности, почему Ls -l не удалось , почему Ls не сделал.
РЕДАКТИРОВАТЬ : -D = true может дать больше вывода, но не в моем случае ...
Ответы:
events
Команда Docker может помочь, а команда Docker logs может извлечь журналы, даже если не удалось запустить образ.Сначала запустите
docker events
в фоновом режиме, чтобы увидеть, что происходит.Затем выполните свою неудачную
docker run ...
команду. Тогда вы должны увидеть что-то вроде следующего на экране:Затем вы можете получить шестнадцатеричный идентификатор запуска из предыдущего сообщения или выходных данных команды запуска. Затем вы можете использовать его с командой logs:
Теперь вы должны увидеть некоторые результаты неудачного запуска образа.
Как сказал @alexkb в комментарии: это
docker events&
может быть неприятно, если ваш контейнер постоянно перезапускается из-за чего-то вроде сервиса AWS ECS. В этом случае может быть проще получить шестнадцатеричный идентификатор контейнера из журналов/var/log/ecs/ecs-agent.log.<DATE>
. Тогда используйте докерlogs <hex id>
.источник
(from xxx/xxx:latest) die
"?docker events&
может быть хлопотно, если ваш контейнер постоянно перезапускается из-за чего-то вроде сервиса AWS ECS. Таким образом, в этом случае может быть проще получить шестнадцатеричный идентификатор контейнера из журналов/var/log/ecs/ecs-agent.log.<DATE>
. Затем используйтеdocker logs <hex id>
как предложено в этом ответе, чтобы увидеть, почему вещи не загружаются.Ну, лучшее, что я обнаружил, это:
Просто запустите клиент из новой оболочки. Заблуждением было думать, что клиент на самом деле вообще что-то делает ... ну, это просто общение с демоном, поэтому вы не хотите отлаживать клиента, а самого демона (обычно).
источник
В моем случае
-a
флага (прикрепить к STDOUT / STDERR) было достаточно:Он показал ошибку запуска (в нашем случае использовался отсутствующий путь к журналу
supervisord
). Я предполагаю, что большинство ошибок запуска контейнера также будет отображаться здесь.источник
Я не могу ответить на ваш вопрос о том, как сделать вывод в Docker более полным, но я могу вам сказать, что регулярное выражение на месте, заменяющее строку в файле .so, немного ненормально: для строки выделено только столько места, и если вы измените смещения файлов других записей, файл elf будет поврежден. Попробуйте запустить objdump или readelf для вашего .so файла после выполнения команды perl ( до изменения LD_LIBRARY_PATH ) вне контейнера - доллары, чтобы пончики теперь повреждены.
Причина, по которой он работает в этом крайне необходимом хаке, заключается в том, что «tmp» и «etc» имеют одинаковую длину строки, поэтому смещения не меняются. Рассмотрите каталог / dkr или аналогичный, если вы предпочитаете не использовать / tmp.
Если вы ДОЛЖНЫ использовать этот подход, и желаемые пути неизменны, перестройте библиотеку и измените путь по умолчанию для / etc / hosts в источнике. Или лучше, когда вы создаете свой измененный,
libnss_files.so
переименуйте его в что-то похожееlibnss_altfiles.so
и измените,nsswitch.conf
чтобы использовать егоhosts: altfiles
при запуске контейнера докера (если докер также не имеет привязанного монтируемого nsswitch.conf, вы не можете его изменить). Это позволит вам иметь libnss_altfiles.so параллельно с вашими обычными библиотеками в базовой системе. Если docker выполняет bind-mount nsswitch.conf, оставьте копию перестроенного libnss_files.so в каталоге / lib-override, готового для загрузки LD_LIBRARY_PATH.Напротив, двоичные файлы suid / sgid игнорируют LD_LIBRARY_PATH и LD_PRELOAD, поэтому некоторые вещи могут сломаться (читай: вернитесь к использованию по умолчанию / etc / hosts), если вы используете эти переменные.
источник
Иногда вы можете найти полезные сообщения об ошибках, запустив sshing в узел, на котором запущен демон docker, и затем выполните:
В «Docker Community Edition» в Mac OS вы можете подключиться к Docker vm, выполнив:
источник