捕获在Docker中运行的程序的输出

时间:2017-04-04 20:10:48

标签: docker

我使用docker来运行bash脚本,我需要捕获它的输出和它的输出。

docker run --rm --volume=/tmp/test.sh:/tmp/test.sh:ro --entrypoint=/bin/bash node:4.6.0 -xe /tmp/test.sh

问题是我也从docker下载图像获得输出。想像:

Unable to find image 'node:4.6.0' locally
4.6.0: Pulling from library/node
6a5a5368e0c2: Pulling fs layer
7b9457ec39de: Pulling fs layer
ff18e19c2db4: Pulling fs layer
6a3d69edbe90: Pulling fs layer
0ce4b037e17f: Pulling fs layer

有没有办法只捕获docker运行的bash脚本生成的输出,而没有docker可能输出的任何其他消息/错误/警告?

1 个答案:

答案 0 :(得分:5)

docker输出被发送到stderr,因此它可以与正常的脚本输出区分开来。

如果你需要容器​​中的stderr和stdout,请使用docker logs的输出,这是最安全的选项,但设置起来要复杂一些。 注意日志仅在本地使用默认json-filejournald log drivers

CID=$(docker run -d --volume=/tmp/test.sh:/tmp/test.sh:ro \
        --entrypoint=/bin/bash node:4.6.0 -xe /tmp/test.sh)
docker wait $CID
docker logs $CID
docker rm $CID

如果您只对进程的stdout感兴趣,请将stdout重定向到文件。任何错误输出以及码头工具都将进入屏幕。该文件仅包含stdout数据。

docker run --rm --volume=/tmp/test.sh:/tmp/test.sh:ro \
  --entrypoint=/bin/bash node:4.6.0 -xe /tmp/test.sh > output

您还可以将stderr重定向到容器内的stdout,这样您只会丢失docker stderr输出。

docker run -rm --volume=/tmp/test.sh:/tmp/test.sh:ro \
  --entrypoint=/bin/bash node:4.6.0 -xec '/tmp/test.sh 2>&1' > output