web-dev-qa-db-ja.com

dockerでコマンド出力をリダイレクトする

Dockerコンテナーで実行されている小さなFlaskアプリである私のサーバーに対して、いくつかの簡単なロギングを実行したいです。

ここに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すると、コンソールでアプリが出力を生成しているのがわかります。

Dockerを使用しているときにstdout/errを適切にファイルにリダイレクトするにはどうすればよいですか?

6
Dreen

ユースケースについて質問したいのですが。 stderr/stdoutをコンテナー内のログファイルにリダイレクトする必要があるのはなぜですか?マージされたstderrとstdoutは、「docker logs」を使用してコンテナーの外部で利用でき、ファイル(コンテナーの外部)にリダイレクトできます。詳細については、 here を参照してください。

6
John

関連するユースケースに関する情報は次のとおりです:Docker Cloudで実行されているコンテナー内で出力をリダイレクトする必要があります

私の場合、Docker Cloudで長時間実行されるデータ分析スクリプト(Java)を実行しています。各コンテナは独自の結果ファイルを書き込むことになっています。私はJava:8-jre画像を使用しており、次の行で「コマンドの実行」を上書きします。

bash -c "Java -jar /code/analyzer.jar > /data/results-$RANDOM.txt"

Bashの$RANDOM変数を使用することで、結果を個別に収集しながら、Docker Cloudのコンテナー数を必要なだけ拡大できます。

2
hheimbuerger

シェルパイプラインまたはシェルリダイレクトでdocker runを使用し、runがstdinを受け入れ、stdoutおよびstderrに適切に出力するようにするには、次のように入力します。

docker run -i --log-driver=none -a stdin -a stdout -a stderr ...

例えば含まれている環境でAlpineイメージを実行し、UNIXコマンドcatを実行するには:

echo "This was piped into docker" |
  docker run -i --log-driver=none -a stdin -a stdout -a stderr \
    Alpine cat - |
  xargs echo This is coming out of docker: 

放出する:

This is coming out of docker: This was piped into docker
1

あなたはティーを探しています

LOGFILE="logthis.txt";
IMG_Alpine="Alpine:3.5";

docker run --rm \
--name Alpine-hello \
--hostname Alpine-hello \
"$IMG_Alpine" \
uname -a | tee -a $LOGFILE

cat logthis.txt
Linux Alpine-hello 4.8.14-docker-2 #1 SMP Tue Jan 10 15:35:02 UTC 2017 x86_64 Linux
0
Pascal Andy