Як читати файли та stdout із запущеного контейнера Docker


78

Як би я запустив програму на моїй хост-машині, щоб читати файли та stdout із запущеного контейнера докера?

По суті, я хочу зробити це:

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

Як би я це зробив? Щоб бути більш конкретним щодо того, куди я намагаюся піти з цим; Я хочу прочитати журнали та stdout контейнера докера і переробити ці журнали в іншому місці.

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

Відповіді:


119

Стандартний висновок процесу , що запускається контейнер Docker доступний через docker logs $containeridкоманду (використання , -fщоб зберегти її назавжди). Іншим варіантом було б передавати журнали безпосередньо через віддалений API докера .

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

Якщо вам не потрібен доступ до журналів у режимі реального часу, ви можете експортувати файли (у форматі tar) за допомогоюdocker export


1
Гарна знахідка. Схоже, журнали контейнерного хвоста були введені у версії 1.1.0
rexposadas

@rexposadas -fопція існує дуже давно (у часовому масштабі докера , так чи інакше). Щонайменше 7 місяців відповідно до цього випуску: github.com/dotcloud/docker/issues/2997
Абель

Ми налаштували Cloudwatch, який чудово зберігає деякі журнали, але не зберігає журнали stdout. Ваше рішення спрацювало, ми могли б переглянути ці журнали, запустивши команду docker logs, але як ми можемо продовжувати надсилати його до Cloudwatch?
Ondrej Tokar

1
@OndrejTokar Я не знайомий з Cloudwatch, але ви можете docker logsнаправити команду у файл, щоб переглянути цей файл, або зробити це безпосередньо в контейнері та виставити файл журналу як том.
Абель Муйньо,

1
@OndrejTokar, я думаю, ви маєте на увазі диск awslogs ( docs.docker.com/engine/admin/logging/awslogs ). Публікуйте тут на випадок, якщо інші зацікавлені.
wanghq

16

Щоб переглянути stdout, ви можете запустити контейнер докера за допомогою -i. Звичайно, це не дозволяє вам залишити розпочатий процес і дослідити контейнер.

docker start -i containerid

Ви також можете переглянути файлову систему контейнера за адресою

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

Однак жодне з них не є ідеальним. Якщо ви хочете переглянути журнали або будь-яке постійне сховище, правильним способом цього буде приєднання тома за допомогою -vперемикача, коли ви використовуєте docker run. Це означало б, що ви можете перевірити файли журналів або на хості, або прикріпити їх до іншого контейнера і перевірити там.


6

Трохи пізно, але це те, з чим я роблю 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"тощо


1
Це краща відповідь з усіх них!
Басіт Анвер

4

Спільний доступ до файлів між контейнером докера та основною системою або між окремими контейнерами найкраще здійснювати за допомогою томів .

Запуск програми в іншому контейнері - це, мабуть, найкраще рішення, оскільки це гарантує, що вся ваша програма може бути добре ізольована та легко розгорнута. Те, що ви намагаєтесь зробити, звучить дуже близько до налаштувань, описаних у цьому чудовому дописі в блозі , подивіться!


Дякую за пропозицію. Використання томів, ймовірно, не є можливим. Я не хочу казати творцеві зображень зберігати свої журнали у певному томі / каталозі. Метою було читати журнальні файли скрізь, куди їх записав творець програми.
rexposadas

4

Ви можете переглянути файлову систему контейнера за адресою

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

а можна просто

tail -f mylogfile.log

3
Ці
папки

Для користувачів OSX це місце буде порожнім, оскільки докер буде запущений у віртуальній машині boot2docker, тому вам доведеться шукати це місце на віртуальній машині.
Michael Barton

На OSX журнали можуть бути за адресою ~ / Library / Containers / com.docker.docker / Data / com.docker.driver.amd64-linux / log / docker.log . Я використовую докер 1.12.3.
wanghq

2
У моїй ситуації я знайшов журнал за адресою:
/var/lib/docker/containers/<containerID>/<containerID>-json.log
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.