Подтвердить что ты не робот

Перенаправление вывода команды в докере

Я хочу сделать несколько простых протоколов для моего сервера, который представляет собой небольшое приложение Flask, работающее в контейнере Docker.

Вот файл Dockerfile

# Dockerfile
FROM dreen/flask
MAINTAINER dreen
WORKDIR /srv

# Get source
RUN mkdir -p /srv
COPY perfektimprezy.tar.gz /srv/perfektimprezy.tar.gz
RUN tar x -f perfektimprezy.tar.gz
RUN rm perfektimprezy.tar.gz

# Run server
EXPOSE 80
CMD ["python", "index.py", "1>server.log", "2>server.log"]

Как вы можете видеть в последней строке, я перенаправляю stderr и stdout в файл. Теперь я запускаю этот контейнер и оболочку в него

docker run -d -p 80:80 perfektimprezy
docker exec -it "... id of container ..." bash

И обратите внимание на следующее:

Сервер работает, а веб-сайт работает

Нет /srv/server.log

ps aux | grep python дает:

root         1  1.6  3.2  54172 16240 ?        Ss   13:43   0:00 python index.py 1>server.log 2>server.log
root        12  1.9  3.3 130388 16740 ?        Sl   13:43   0:00 /usr/bin/python index.py 1>server.log 2>server.log
root        32  0.0  0.0   8860   388 ?        R+   13:43   0:00 grep --color=auto python

Но нет журналов... ОДНАКО, если я docker attach для контейнера, я могу видеть вывод приложения в консоли.

Как правильно перенаправить stdout/err в файл при использовании Docker?

4b9b3361

Ответ 1

Когда вы указываете список JSON как CMD в Dockerfile, он не будет выполнен в оболочке, поэтому обычные функции оболочки, такие как перенаправление stdout и stderr, не будут работать.

Из документации:

Форма exec анализируется как массив JSON, что означает, что вы должны использовать двойные кавычки (") вокруг слов, а не одиночных кавычек (').

В отличие от формы оболочки форма exec не вызывает командную оболочку. Это означает, что нормальной обработки оболочки не происходит. Например, CMD [ "echo", "$HOME" ] не будет выполнять замену переменных на $HOME. Если вы хотите обработать оболочку, то либо используйте форму оболочки, либо выполните оболочку напрямую, например: CMD [ "sh", "-c", "echo", "$HOME" ].

Фактически ваша команда выполняет ваш index.py script и передает строки "1>server.log" и "2>server.log" в качестве аргументов командной строки в этот python script.

Используйте один из следующих вариантов (оба должны работать):

  • CMD "python index.py > server.log 2>&1"
  • CMD ["/bin/sh", "-c", "python index.py > server.log 2>&1"]

Ответ 2

Просто дополняя, используя docker-compose, вы также можете попробовать:

command: bash -c "script_or_command > /path/to/log/command.log 2>&1"