Вопрос: Как я могу отлаживать инициализацию контейнера докеров?


У меня возникла проблема с контейнером, хотя он отлично работает, и он не запускается должным образом. Причиной является обходной путь, который я добавил в файл Docker (для автоматической настройки маршрутизации / 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, чтобы быть более подробным?

РЕДАКТИРОВАТЬ: Спасибо Andrew D. Теперь я знаю, что не так с кодом выше (я оставил его, чтобы его можно было понять). Теперь проблема заключается в том, как я могу отладить что-то вроде этого или получить некоторые из ls -l почему Ls не.

РЕДАКТИРОВАТЬ: -D = true может дать больше результатов, хотя не в моем случае ...


55
2018-05-19 15:28


Источник


Пожалуйста, приложите усилия, чтобы отметить один из ответов как «принятый», спасибо! - Brian Topping


Ответы:


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

Первый запуск docker events на заднем плане, чтобы посмотреть, что происходит.

docker events&

Затем запустите свой сбой docker run ... команда. Затем на экране вы увидите следующее:

2015-12-22T15:13:05.503402713+02:00 xxxxxxxacd8ca86df9eac5fd5466884c0b42a06293ccff0b5101b5987f5da07d: (from xxx/xxx:latest) die

Затем вы можете получить шестнадцатеричный идентификатор запуска из предыдущего сообщения или выход команды запуска. Затем вы можете использовать его с командой logs:

docker logs <copy the instance id from docker events messages on screen>

Теперь вы должны увидеть некоторые результаты неудачного запуска образа.

Как @alexkb предложил в комментарии: docker events& может быть неприятным, если ваш контейнер постоянно перезапускается из чего-то вроде службы AWS ECS. В этом случае может быть проще получить шестнадцатеричный id контейнера из журналов в /var/log/ecs/ecs-agent.log.<DATE>, Затем используйте докер logs <hex id>,


56
2017-12-22 13:24



Очень полезно! Новое для докеров и пыталось запустить portainer. Решил его с помощью этих шагов отладки. Нашел кого-то на Medium.com с той же проблемой: medium.com/@jameson_37151/... - Jameson
Я получаю «контейнер не найден» !? - demented hedgehog
Странный. Чтобы убедиться, @dementedhedgehog, вы попытались скопировать шестнадцатеричный идентификатор из сообщения журнала, заканчивающегося на "(from xxx/xxx:latest) die«? - Peter Lamberg
Большое вам спасибо за этот ответ, это спасатель жизни. Остается добавить только то, что docker events& может быть неприятным, если ваш контейнер постоянно перезапускается из чего-то вроде службы AWS ECS. Таким образом, в этом случае может быть проще получить шестнадцатеричный id контейнера из журналов в /var/log/ecs/ecs-agent.log.<DATE>, Затем используйте docker logs <hex id> как было предложено в этом ответе, чтобы понять, почему вещи не загружаются. - alexkb
@alexkb Спасибо! Я добавил ваше предложение в конце ответа, чтобы другие могли найти его более легко. - Peter Lamberg


Ну, лучшее, что я обнаружил до сих пор:

#stop the current demon and start it in debug modus
sudo service docker stop
dockerd -D # --debug

Просто запустите клиент из новой оболочки. Заблуждение состояло в том, чтобы думать, что клиент на самом деле вообще что-то делает ... ну, это просто общение с демоном, поэтому вы не хотите отлаживать клиент, но сам демон (обычно).


14
2018-05-26 09:07





В моем случае -a (прикреплять к STDOUT / STDERR) был достаточно:

user@machine:~$ docker start -a server_name
Error: The directory named as part of the path /log/log_path/app.log does not exist.
For help, use /usr/bin/supervisord -h

Он показал ошибку запуска (в нашем случае отсутствующий путь к журналу, используемый supervisord). Я предполагаю, что большинство ошибок запуска контейнера появятся здесь.


5
2018-03-29 13:27





Я не могу ответить на ваш вопрос о том, как сделать вывод 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 выполняет привязку привязки nsswitch.conf, оставьте копию восстановленного libnss_files.so в каталоге / lib-override, готовом для загрузки LD_LIBRARY_PATH.

Как хэдз-ап, двоичные файлы suid / sgid игнорируют LD_LIBRARY_PATH и LD_PRELOAD, поэтому некоторые вещи собираются сломаться (прочитайте: вернитесь к использованию по умолчанию / etc / hosts), если вы используете эти переменные.


2
2018-05-19 21:01



Большое спасибо за великолепное понимание ... Я был слишком быстр и теперь вижу, что происходит. Я до сих пор не знаю, почему получение stat необходимо для решения хоста (ls -l), а простой список файлов (ls), не ... - estani