сохранение файлов журнала Docker с томами приводит к отказу в разрешении

Я пытаюсь проверить сохранение файлов журнала контейнеров докеров при игре на этом сайте, что дает вам корневая оболочка Linux с установленным докером. Я использовал решение, предоставленное здесь< /а>:

docker run -ti -v /dev/log:/root/data --name zizimongodb mongo

Вот что я получил в консоли:

docker: Error response from daemon: oci runtime error: container_linux.go:262: starting container process caused "process_linux.go:339: container init caused \"rootfs_linux.go:57: mounting \\\"/dev/log\\\" to rootfs \\\"/graph/overlay2/7f1eb83902e3688c0a1204c2fe8dfd8fbf43e1093bc578e4c41028e8b03e4b38/merged\\\" at \\\"/graph/overlay2/7f1eb83902e3688c0a1204c2fe8dfd8fbf43e1093bc578e4c41028e8b03e4b38/merged/root/data\\\" caused \\\"permission denied\\\"\"".

Но контейнер запустился:

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
8adaa75ba6f7        mongo               "docker-entrypoint..."   2 minutes ago       Created                                 zizimongodb

docker logs -f zizimongodb ничего не возвращает. Когда я останавливаю контейнер, в файле /root/data ничего не сохраняется. Любая идея, как я могу правильно сохранить все журналы?


person Zeinab Abbasimazar    schedule 27.08.2017    source источник
comment
Почему вы используете /dev/log ? Попробуйте использовать /var/log/mongodb:/root/data   -  person Tarun Lalwani    schedule 27.08.2017
comment
@TarunLalwani, во-первых, у меня есть много компонентов, журнал которых я хочу получать из своих контейнеров; Я хочу сохранить журналы докеров, чтобы получить доступ ко всем из них. Во-вторых, я попробовал ваше предложение, после остановки и последующего удаления контейнера ничего не сохранилось.   -  person Zeinab Abbasimazar    schedule 27.08.2017
comment
Ну, это потому, что mongo не делится журналами на /root/data. Если вы проверяете контейнер mongodb, журналы отправляются на /var/log/mongodb/mongod.log. Так почему вы ожидаете, что это сработает?   -  person Tarun Lalwani    schedule 27.08.2017
comment
@TarunLalwani, /root/data — это каталог моего хоста, а /var/log/mongodb — каталог контейнера. Я пытаюсь смонтировать каталог контейнера в каталог хоста, чтобы сохранить содержимое каталога контейнера в каталог моего хоста; поэтому я могу получить к нему доступ после остановки или удаления моего контейнера. Я делаю неправильно, чтобы добиться этого?   -  person Zeinab Abbasimazar    schedule 27.08.2017
comment
Формат hostpath:containerpath. Вам нужно использовать /root/data/logs/:/var/log/mongodb/. Это позволит получить каждый журнал из контейнера на /root/data/logs на вашем хосте.   -  person Tarun Lalwani    schedule 27.08.2017
comment
@TarunLalwani, ты прав; но я пытался и все еще не сохранял журналы в каталоге хоста.   -  person Zeinab Abbasimazar    schedule 29.08.2017


Ответы (1)


Поскольку вы используете официальный образ mongo из DockerHub, стоит отметить, что этот официальный образ (как и многие — или все? — официальные образы) не отправляет вывод журнала в свой журнал по умолчанию места, которые вы можете ожидать, если загрузите дистрибутивную версию того же программного обеспечения Linux.

Вместо этого большинство программ, которым можно указать, куда вести журнал, вынуждены вести журнал в stdout/stderr, чтобы подключаемые модули журнала Docker и сама команда docker log работали правильно.

В случае с mongodb вы можете увидеть этот несколько сложный код >здесь, который указывает процессу mongodb использовать файловый дескриптор файловой системы /proc, который сопоставляется с «stdout», если он доступен для записи при запуске контейнера. Из-за некоторых ошибок это сложнее, чем другие Dockerfile настройки вывода журнала (вы можете прочитать больше, если интересно, по ссылкам в комментариях).

Я думаю, что более разумный способ попытаться выполнить какую-либо форму консолидации или сбора журналов — это прочитать о драйверы журналов Docker и посмотрите, подходит ли вам какой-либо из этих вариантов. Например, если вам нравится journald, есть драйвер, который будет брать все журналы контейнера и передавать их в journald на хосте.

person Phil E    schedule 28.08.2017
comment
Часто удобнее иметь журналы в соответствующем файле. Наличие их в docker logs может быть дополнительной функцией, но я считаю, что вы все равно должны хранить журналы в виде файлов. - person The Godfather; 21.08.2018