Shell - как извлечь и заменить значения из файла в цикле for - PullRequest
0 голосов
/ 24 сентября 2018

Я пишу пример сценария, который будет собирать журналы из докер-контейнеров.
Контейнеры работают с приложениями .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

Что должен делать скрипт:

  1. Проверьте наличие каталога XXX в / var / log, создайте, если не существует
  2. Создайте новый каталог в / var / log / XXX в соответствии с сегодняшней датой
  3. Для каждого работающего контейнера-докера создайте каталог внутри базового (см. Стр. 2) каталога, используя хэш контейнера (первое значение изтекстовый файл) и отметку времени
  4. Копирование файлов журнала из файловой системы контейнера с помощью команды 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

1 Ответ

0 голосов
/ 25 сентября 2018

Окончательная (рабочая) версия будет выглядеть так:

#!/bin/sh

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
        imagename=$(echo $i | cut -d"," -f2 | cut -d"/" -f4 | cut -d":" -f1)
        echo "Copying log files from container ${container} \ image ${imagename} to path ${TARGETDIR}"
        if [ "$imagename" = "client-api" ]
        then
                $(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)
        elif [ "$imagename" = "data-analysis" ]
        then
                $(docker cp ${container}:/app/\\${imagename}_app.json $TARGETDIR)
                $(docker cp ${container}:/app/\\${imagename}_sql.json $TARGETDIR)
        elif [ "$imagename" = "job-aggregator" ]
        then
                $(docker cp ${container}:/app/\\${imagename}_app.json $TARGETDIR)
                $(docker cp ${container}:/app/\\${imagename}_mt.json $TARGETDIR)
        elif [ "$imagename" = "document-uploader" ]
        then
                $(docker cp ${container}:/app/\\${imagename}_app.json $TARGETDIR)
        elif [ "$imagename" = "capture-plugin" ]
        then
                $(docker cp ${container}:/app/\\${imagename}_app.json $TARGETDIR)
                $(docker cp ${container}:/app/\\${imagename}_mt.json $TARGETDIR)
                $(docker cp ${container}:/app/\\${imagename}_sql.json $TARGETDIR)
        fi
done

rm -rf docker_running.txt
...