Как читать файлы и stdout из запущенного контейнера Docker
Как я могу запустить приложение на моем хост-компьютере, чтобы читать файлы и stdout из работающего контейнера docker?
по сути, я хочу сделать это:
docker start containerid
./myapp // This app will *somehow* have access files and stdout generated by the container I just stared.
Как бы я это сделал? Чтобы быть более конкретным с тем, где я пытаюсь пойти с этим; я хочу прочитать журналы и stdout контейнера docker и обработать эти журналы где-то еще.
Я также готов создать еще один контейнер docker, который может чтение файлов и stdout из другого контейнера, но я не знаю, возможно ли это.
5 ответов:
The stdout процесс, запущенный контейнером docker, доступен через
docker logsкоманда (использовать-fчтобы это продолжалось вечно). Другой вариант-потоковая передача журналов непосредственно через docker remote API.для доступа к файлам журнала (только если вы должны, рассмотреть возможность ведения журнала в stdout или другое стандартное решение, как syslogd) ваш единственный вариант в режиме реального времени является настройки громкости (как Маркус Хьюз предлагает) , поэтому журналы хранятся вне контейнера и доступны для обработки с хоста или другого контейнера.
Если вам не нужен доступ в реальном времени к журналам,вы можете экспортировать файлы (в формате tar) с
docker export
чтобы просмотреть stdout, вы можете запустить контейнер docker с помощью
-i. Это, конечно, не позволяет вам оставить начатый процесс и исследовать контейнер.docker start -i containeridв качестве альтернативы вы можете просмотреть файловую систему контейнера по адресу
ни из них идеальны. Если вы хотите просмотреть журналы или любое постоянное хранилище, правильным способом будет вложение объемом С/var/lib/docker/containers/containerid/root/-vпереключатель, когда вы используйтеdocker run. Это означает, что вы можете проверить файлы журналов либо на хосте, либо прикрепить их к другому контейнеру и проверить их там.
вы можете просмотреть файловую систему контейнера по адресу
/var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/а можно просто
tail -f mylogfile.log
совместное использование файлов между контейнером docker и хост-системой или между отдельными контейнерами лучше всего выполнять с помощью Тома.
наличие вашего приложения, работающего в другом контейнере, вероятно, является лучшим решением, поскольку оно гарантирует, что все ваше приложение может быть хорошо изолировано и легко развернуто. То, что вы пытаетесь сделать, звучит очень близко к настройке, описанной в это отличный пост в блоге взгляни!
немного поздно, но это то, что я делаю с
journald. Он довольно мощный.вы должны быть запущены ваши контейнеры docker на ОС с
systemd-journald.
docker run -d --log-driver=journald myappэто все трубы в journald хозяина, который заботится о вещи, как обрезка журнала, формат хранения и т. д., и дает вам некоторые интересные варианты для просмотра:
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"etc
Comments