Docker CMD在容器内后台运行bash脚本

Docker CMD在容器内后台运行bash脚本,docker,containers,Docker,Containers,我正在尝试在后台运行脚本,而此时容器(在容器内)正在运行 我有以下简单的start.sh: f() { echo "Sleep" sleep 10 echo "Done" } f Dockerfile: FROM alping COPY start.sh /tmp CMD /tmp/start.sh & 在docker运行后docker状态为Exited(0) 我还尝试将start.sh更改为: f() { echo "Sleep" sle

我正在尝试在后台运行脚本,而此时容器(在容器内)正在运行

我有以下简单的
start.sh

f() {
    echo "Sleep"
    sleep 10
    echo "Done"
}

f 
Dockerfile:

FROM alping
COPY start.sh /tmp
CMD /tmp/start.sh &
docker运行后
docker状态为
Exited(0)

我还尝试将start.sh更改为:

f() {
    echo "Sleep"
    sleep 10
    echo "Done"
}

f & #Run f function here in background
Dockerfile:

FROM alping
COPY start.sh /tmp
CMD /tmp/start.sh & # Trying also: CMD /bin/sh -c "/tmp/start.sh"
并获得相同的
退出(0)
状态

那么,当容器创建时,我如何在后台运行脚本呢?

您不需要“在后台运行”,启动容器时不会运行其他命令


如果您想在后台启动容器,可以执行
docker run--detach
,但是CMD中的
&
是不必要的。

正如我在评论中提到的,您应该能够从
start.sh
中在后台运行函数。如果不调用
wait
,则容器将在脚本末尾退出(带有前台进程的退出代码)。如果您确实在等待后台函数,那么在它完成之前,您应该会看到这两条语句都打印到容器日志中


通常最好的做法是每个容器大约有一个进程,但肯定有可能有更多的进程,并且有很好的案例可以应用这种方法。

如果您添加一个调用以等待到start.sh的底部,会发生什么情况?当主前台进程退出时,容器定义为退出。这是什么过程?@DavidMaze实际上我需要启动容器,等待60秒,然后在容器内运行我的脚本我需要在后台运行我的脚本当容器创建时我想要我的脚本。sh在容器内后台运行,等待60秒(在睡眠中)然后开始我用另一个没有退出的应用程序运行container,我只是试着在应用程序运行时运行我的脚本是的,这会起作用。您的示例之所以存在,是因为前景中什么都没有发生。如果您使用
&
从启动脚本启动后台进程,然后启动长时间运行的前台进程,这两个进程将在同一个容器中同时运行。好的,我只是尝试在f&command之后添加“sleep 15”,它仍然存在,代码为0