我有一个像这样的简单 Dockerfile
FROM ubuntu:latest
ADD run.sh /run.sh
CMD /run.sh
Run Code Online (Sandbox Code Playgroud)
在 run.sh 中,我有这个(也非常简单)
#!/bin/bash
nohup awk 'BEGIN { while (c++<50) print "y" }' &
sleep 10
Run Code Online (Sandbox Code Playgroud)
当我在 docker 中从 bash 运行脚本时(即,在交互模式下运行 bash 命令并在那里运行脚本),它工作正常——它进入“nohup 模式”并且输出正确地在 nohup.out 中。
但是,如果我使用/run.sh
默认命令运行 docker 容器,则输出仍为 STDOUT。
我究竟做错了什么?为什么它可以在 docker 和 bash 中工作,但只能在交互模式下运行?
Gil*_*il' 10
nohup
如果它要去终端,则仅重定向命令的输出。如果输出已经转到另一种类型的文件(例如常规文件或管道),则nohup
假定这是需要的并且不会重定向到nohup.out
.
默认情况下,docker run
通过套接字运行命令(将主机与虚拟环境连接 - 这就是它们的通信方式)。套接字不是终端,因此nohup
不执行任何重定向。
如果您运行,docker run -t
Docker 将模拟容器中的终端,因此nohup
将重定向到nohup.out
. 如果您不传递命令名称,则 docker 的行为就像您使用了docker run -t bash
.
最好的解决方案是将命令的输出显式重定向到您选择的日志文件。不要忘记重定向 stderr。这样你就知道他们要去哪里了。
nohup awk 'BEGIN { while (c++<50) print "y" }' >myscript.log 2>&1 &
Run Code Online (Sandbox Code Playgroud)