Я пишу пример сценария, который будет собирать журналы из докер-контейнеров.
Контейнеры работают с приложениями .NET Core (* .dll файлы), а файлы журналов записываются в тот же каталог (где находится файл сборки.находится), используя Nlog.
#!/bin/bash
DATE=`date +%Y%m%d`
LOGPATH="/var/log/kbci-ocr"
LOGDIR="${LOGPATH}/LOG-${DATE}"
LOGERR="${LOGDIR}/err.log"
docker ps --format {{.ID}},{{.Image}} > docker_running.txt
file=docker_running.txt
for i in `cat $file`
do
echo "Checking log dir presence"
if [ ! -d $LOGDIR ]; then
mkdir -p $LOGDIR;
echo "Log dir created"
else
echo "Log dir exist"
fi
echo "Creating log dir for the current log saving iteration"
container=$(echo $i | cut -d"," -f1)
TARGETDIR="${LOGDIR}/${container}+$(date +%Y%m%d_%H%M%S)"
mkdir -p $TARGETDIR
echo "Copying log files from container ${container}"
imagename=$(echo $i | cut -d"," -f2 | cut -d"/" -f4 | cut -d":" -f1)
docker cp ${container}:/app/'\${imagename}_app.json' ${TARGETDIR}
docker cp ${container}:/app/'\${imagename}_errors.json' ${TARGETDIR}
docker cp ${container}:/app/'\${imagename}_sql.json' ${TARGETDIR}
docker cp ${container}:/app/'\${imagename}_webHost.json' ${TARGETDIR}
done
rm -rf docker_running.txt
Что должен делать скрипт:
- Проверьте наличие каталога XXX в / var / log, создайте, если не существует
- Создайте новый каталог в / var / log / XXX в соответствии с сегодняшней датой
- Для каждого работающего контейнера-докера создайте каталог внутри базового (см. Стр. 2) каталога, используя хэш контейнера (первое значение изтекстовый файл) и отметку времени
- Копирование файлов журнала из файловой системы контейнера с помощью команды
docker cp
и имени изображения контейнера (второе значение из текстового файла)
Здесь яВозникла проблема - как извлечь второе значение из текстового файла и подставить его в скрипт оболочки?
Пример вывода Docker, помещенного в файл:
sergey@023:~$ cat docker_running.txt
b0a6dbb31f4e,ecse00:5000/develop/client-api:latest
d80f5e5a2cf5,ecse00:5000/develop/document-uploader:latest
965e9b40a8d0,ecse00:5000/develop/data-analysis:latest
ef8a6bad36a7,ecse00:5000/develop/job-aggregator:latest
be4ccd899a61,ecse00:5000/develop/capture-plugin:latest
Первый - это идентификатор контейнера, второй (после двоеточия) - это имя изображения + тег с предшествующим адресом реестра Docker.
Я перепробовал множество вариантов, но до сих пор не знаю, как правильно написать скрипт.
Upd: Сценарий, кажется, работает, последний вопрос - как заменить имя изображения на команду docker cp
:
sergey@ECSE00:~$ sh collect_logs.sh
Checking log dir presence
Log dir created
Creating log dir for the current log saving iteration
Copying log files from container f44d14d08b61
Error: No such container:path: f44d14d08b61:/app/\${imagename@Q}_app.json
Error: No such container:path: f44d14d08b61:/app/\${imagename@Q}_errors.json
Error: No such container:path: f44d14d08b61:/app/\${imagename@Q}_sql.json
Error: No such container:path: f44d14d08b61:/app/\${imagename@Q}_webHost.json
Checking log dir presence
Log dir exist
Creating log dir for the current log saving iteration
Copying log files from container 13f0069c207a
client-api
Error: No such container:path: 13f0069c207a:/app/\${imagename@Q}_app.json
Error: No such container:path: 13f0069c207a:/app/\${imagename@Q}_errors.json
Error: No such container:path: 13f0069c207a:/app/\${imagename@Q}_sql.json
Error: No such container:path: 13f0069c207a:/app/\${imagename@Q}_webHost.json
Checking log dir presence
Log dir exist
Creating log dir for the current log saving iteration
Copying log files from container 8ff648fa8b04
document-uploader
Error: No such container:path: 8ff648fa8b04:/app/\${imagename@Q}_app.json
Error: No such container:path: 8ff648fa8b04:/app/\${imagename@Q}_errors.json
Error: No such container:path: 8ff648fa8b04:/app/\${imagename@Q}_sql.json
Error: No such container:path: 8ff648fa8b04:/app/\${imagename@Q}_webHost.json
Checking log dir presence
Log dir exist
Creating log dir for the current log saving iteration
Copying log files from container 1ee8ad5cab31
data-analysis
Error: No such container:path: 1ee8ad5cab31:/app/\${imagename@Q}_app.json
Error: No such container:path: 1ee8ad5cab31:/app/\${imagename@Q}_errors.json
Error: No such container:path: 1ee8ad5cab31:/app/\${imagename@Q}_sql.json
Error: No such container:path: 1ee8ad5cab31:/app/\${imagename@Q}_webHost.json
Checking log dir presence
Log dir exist
Creating log dir for the current log saving iteration
Copying log files from container 53a8467cd7f6
job-aggregator
Error: No such container:path: 53a8467cd7f6:/app/\${imagename@Q}_app.json
Error: No such container:path: 53a8467cd7f6:/app/\${imagename@Q}_errors.json
Error: No such container:path: 53a8467cd7f6:/app/\${imagename@Q}_sql.json
Error: No such container:path: 53a8467cd7f6:/app/\${imagename@Q}_webHost.json