Подтвердить что ты не робот

Как читать файлы и stdout из работающего контейнера Docker

Как мне приступить к запуску приложения на моей главной машине, чтобы читать файлы и stdout из работающего контейнера докеров?

По существу, я хочу сделать это:

docker start containerid   
./myapp // This app will *somehow* have access files and stdout generated by the container I just stared. 

Как бы я это сделал? Чтобы быть более конкретным, где я пытаюсь пойти с этим; Я хочу прочитать журналы и stdout контейнера докеров и обработать эти журналы в другом месте.

Я также хочу создать еще один контейнер докеров, который может читать файлы и stdout из другого контейнера, но я не знаю, возможно ли это.

4b9b3361

Ответ 1

Выходная информация процесса, запущенного контейнером Docker, доступна с помощью команды docker logs $containerid (используйте -f, чтобы она продолжалась вечно). Другой вариант - потоковая передача журналов напрямую через удаленный API Docker.

Для доступа к файлам журналов (только если это необходимо, рассмотрите возможность входа в stdout или другое стандартное решение, такое как syslogd), единственным вариантом в реальном времени является настройка тома (как предлагает Маркус Хьюз), чтобы журналы сохранялись вне контейнер и доступен для обработки от хоста или другого контейнера.

Если вам не нужен доступ к журналам в режиме реального времени, вы можете экспортировать файлы (в формате tar) с помощью docker export

Ответ 2

Чтобы просмотреть файл stdout, вы можете запустить контейнер докера с помощью -i. Это, конечно, не позволяет вам покинуть начатый процесс и изучить контейнер.

docker start -i containerid

В качестве альтернативы вы можете просмотреть файловую систему контейнера в

/var/lib/docker/containers/containerid/root/

Однако ни из них не являются идеальными. Если вы хотите просмотреть журналы или какое-либо постоянное хранилище, правильный способ сделать это будет прикрепление тома с помощью переключатель -v, когда вы используете docker run. Это означало бы, что вы можете проверять файлы журнала на хосте или прикреплять их к другому контейнеру и проверять их там.

Ответ 3

Вы можете просмотреть файловую систему контейнера в

/var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/

и вы можете просто

tail -f mylogfile.log

Ответ 4

Обмен файлами между контейнером докеров и хост-системой или между отдельными контейнерами лучше всего выполняется с помощью volumes.

Наличие вашего приложения в другом контейнере, вероятно, является лучшим решением, так как оно гарантирует, что все ваше приложение может быть хорошо изолировано и легко развернуто. То, что вы пытаетесь сделать, очень близко к настройке, описанной в этом превосходном сообщении в блоге, посмотрите!

Ответ 5

Немного поздно, но это то, что я делаю с journald. Это довольно мощный.

Вам нужно запускать контейнеры докеров в ОС с помощью systemd-journald.

docker run -d --log-driver=journald myapp

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

journalctl CONTAINER_NAME=myapp -f

который будет подавать его на консоль, когда он регистрируется,

journalctl CONTAINER_NAME=myapp > output.log

который дает вам всю сумму в файле для удаления, или

journalctl CONTAINER_NAME=myapp --since=17:45

Кроме того, вы все равно можете видеть журналы через docker logs ...., если это предпочтение.

Больше > my.log или -v "/apps/myapp/logs:/logs" и т.д.