docker logs: bash перенаправление вывода не работает в случае выхода 1 - PullRequest
0 голосов
/ 28 января 2020

У меня проблема с выходом из bash в случае ошибки (exit 1).

Вывод моего сценария bash перенаправляется в файл журнала, но в случае ошибки файл журнала не создан. В обычном сценарии у меня есть правильный файл журнала.

Что усложняет мою проблему, так это то, что мой скрипт выполняется из Dockerfile.

соответствующей части моего Dockerfile:

RUN $ORACLE_HOME/$SCRIPT_FILE.sh param1 param2 >$ORACLE_HOME/$SCRIPT_FILE.sh.log 2>&1

содержимое сценария bash:

#!/bin/bash

ORACLE_HOME=$1
DOMAIN_NAME=$2
DOMAIN_HOME=$ORACLE_HOME/user_projects/domains/$DOMAIN_NAME

echo "Oracle home: "$ORACLE_HOME
echo "Domain home: "$DOMAIN_HOME
echo "Domain name: "$DOMAIN_NAME

# validation
PROPERTIES_FILE=$ORACLE_HOME/properties/domain.properties
if [ ! -e "$PROPERTIES_FILE" ]; then
   echo "A properties file with the username and password needs to be supplied."
   exit 1
fi

...

wlst.sh ... >$ORACLE_HOME/$SCRIPT_FILE.py.log 2>&1
RETURN_VALUE=$?
if [ $RETURN_VALUE -ne 0 ]; then
   echo "Domain creation failed. Return code: $RETURN_VALUE. For more details please check the '$SCRIPT_FILE.py.log' file."
   exit 1
fi

...

Так что в случае любой ошибки мой сценарий bash возвращается с exit 1 и в этом случае перенаправления вывода в лог-файлы не работают. В случае какой-либо ошибки у меня нет таких плохих файлов журнала.

Я использую перенаправление вывода:

something.sh >something.sh.log 2>&1

1 Ответ

0 голосов
/ 29 января 2020

Благодаря сообществу, наконец, я смог решить свою проблему.

Согласно комментарию @DavidMaze, моя проблема была связана с поведением команды RUN:

Если сценарий завершается со статусом 1, затем команда RUN завершается неудачно, и Docker не создает изображение с этого шага; контейнерная файловая система потеряна.

По этой причине я не мог видеть никаких файлов журнала в контейнере в случае ошибки в сценарии bash.

Решение

  1. создайте файл журнала в образе
  2. , передав его в PID 1, чтобы увидеть содержимое журнала в docker logs
  3. bash сценариях, которые необходимо написать регистрируется в этом файле журнала

Таким образом, все, что вы пишете в файл журнала, будет отображаться в docker стандартном выводе.

Мой окончательный файл Docker:

Сценарий
# set the home directory
WORKDIR ${ORACLE_HOME}

# piped logfile into PID 1 in order to see log content in docker logs
RUN touch $ORACLE_HOME/$SCRIPT_FILE.log
RUN ln -sf /proc/1/fd/1 $ORACLE_HOME/$SCRIPT_FILE.log

# execute a script
RUN $ORACLE_HOME/$SCRIPT_FILE.sh $ORACLE_HOME $DOMAIN_NAME $SCRIPT_FILE >$ORACLE_HOME/$SCRIPT_FILE.log 2>&1

bash ($ SCRIPT_FILE. sh):

#!/bin/bash

# define variables
ORACLE_HOME=$1
DOMAIN_NAME=$2
SCRIPT_FILE=$3
DOMAIN_HOME=$ORACLE_HOME/user_projects/domains/$DOMAIN_NAME
echo "Oracle home: "$ORACLE_HOME
echo "Domain home: "$DOMAIN_HOME
echo "Domain name: "$DOMAIN_NAME
echo "Script file: "$SCRIPT_FILE

# validation
PROPERTIES_FILE=$ORACLE_HOME/properties/domain.properties
if [ ! -e "$PROPERTIES_FILE" ]; then
   echo "A properties file with the username and password needs to be supplied."
   exit 1
fi

...

wlst.sh ... $ORACLE_HOME/$SCRIPT_FILE.py >$ORACLE_HOME/$SCRIPT_FILE.log 2>&1
RETURN_VALUE=$?
if [ $RETURN_VALUE -ne 0 ]; then
    echo "Domain creation failed. Return code: $RETURN_VALUE."
    exit 1
fi

Вывод в процессе сборки образа выглядит превосходно:

Step 11/11 : RUN $ORACLE_HOME/$SCRIPT_FILE.sh $ORACLE_HOME $DOMAIN_NAME $SCRIPT_FILE >$ORACLE_HOME/$SCRIPT_FILE.log 2>&1
 ---> Running in 1e7d0d80821e
Oracle home: /u01/oracle
Domain home: /u01/oracle/user_projects/domains/DEV_DOMAIN
Domain name: DEV_DOMAIN
Script file: create-admin-server
Username   : weblogic
Password   : weblogic12
Creating password file for Administration server...
Creating WebLogic domain...

Initializing WebLogic Scripting Tool (WLST) ...

Welcome to WebLogic Server Administration Scripting Shell

Type help() for help on available commands

domain name               : DEV_DOMAIN
domain path               : /u01/oracle/user_projects/domains/DEV_DOMAIN
admin server name         : AdminServer
admin server port         : 7001
machine name              : host_1
cluster name              : DEV_DOMAIN_CLUSTER
managed server name prefix: managed_server
managed server port       : 7011
production mode enabled   : true


WebLogic domain has been created successfully
Script completed successfully.
Removing intermediate container 1e7d0d80821e
Successfully built b4f63eb00e62
Successfully tagged <my-image name>:<version>

 ---> b4f63eb00e62
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...