我使用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可能输出的任何其他消息/错误/警告?
答案 0 :(得分:5)
docker输出被发送到stderr,因此它可以与正常的脚本输出区分开来。
如果你需要容器中的stderr和stdout,请使用docker logs
的输出,这是最安全的选项,但设置起来要复杂一些。 注意日志仅在本地使用默认json-file
和journald
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