Как читать файлы и 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 из другого контейнера, но я не знаю, возможно ли это.
Ответы
Ответ 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"
и т.д.