在后台运行Docker命令?

在后台运行Docker命令?,docker,Docker,如何在Docker中运行守护进程或后台进程?我看到了一些建议,比如CMD的主管 但是,我正在尝试测试一个通过SSH连接的服务器配置工具。因此,我需要在后台启动SSH守护进程,然后运行我的tool.sh来测试通过SSH连接到它自己的容器。我需要监视工具的输出,以验证它是否正常工作。实现这一目标的最佳方式是什么 有没有办法让RUN命令在后台运行,比如RUN/usr/sbin/sshd-D&,或者我需要从CMD启动一些包装器脚本来执行类似的操作 #!/bin/bash /usr/sbin/sshd -

如何在Docker中运行守护进程或后台进程?我看到了一些建议,比如CMD的主管

但是,我正在尝试测试一个通过SSH连接的服务器配置工具。因此,我需要在后台启动SSH守护进程,然后运行我的
tool.sh
来测试通过SSH连接到它自己的容器。我需要监视工具的输出,以验证它是否正常工作。实现这一目标的最佳方式是什么

有没有办法让RUN命令在后台运行,比如
RUN/usr/sbin/sshd-D&
,或者我需要从CMD启动一些包装器脚本来执行类似的操作

#!/bin/bash
/usr/sbin/sshd -D
tool.sh

您可以在docker容器中运行守护程序,就像在裸机linux机器上一样。唯一困难的部分是在没有好的运行级脚本帮助的情况下启动它

这个怎么样:

#/垃圾箱/垃圾箱
函数run_script(){
ssh_-pids=0
而[${ssh_pids}-lt 1];则
睡眠5
ssh_pids=$(pgrep sshd | wc-l)
完成
test.sh
}
运行脚本&
sshd-D>/dev/null 2>&1
我以前用过这个技巧来做你描述的事情,效果很好。它将只对
run_script
进行后台调用,然后在非守护进程模式下继续启动SSHD,并将其传送到
/dev/null
。同时,
run_script
轮询
sshd
;当它找到它时,它退出轮询并运行
test.sh
,该测试应该仍然保持终端的
stdout
。一旦
test.sh
完成,您可能需要使用一些外部终止信号来停止整个过程

如果您不喜欢这种愚蠢的行为,另一种选择是按照您所描述的那样做:编写一个包装器脚本用作CMD/ENTRYPOINT,让它在没有调试标志的情况下启动SSHD,然后启动
test.sh


使用我发布的脚本执行此操作的优点是,容器将在
test.sh
完成后继续运行,因此您可以登录并四处查看,同时让脚本等待守护进程运行。

您可以在docker容器中运行守护进程,就像在裸机linux机器上一样。唯一困难的部分是在没有好的运行级脚本帮助的情况下启动它

这个怎么样:

#/垃圾箱/垃圾箱
函数run_script(){
ssh_-pids=0
而[${ssh_pids}-lt 1];则
睡眠5
ssh_pids=$(pgrep sshd | wc-l)
完成
test.sh
}
运行脚本&
sshd-D>/dev/null 2>&1
我以前用过这个技巧来做你描述的事情,效果很好。它将只对
run_script
进行后台调用,然后在非守护进程模式下继续启动SSHD,并将其传送到
/dev/null
。同时,
run_script
轮询
sshd
;当它找到它时,它退出轮询并运行
test.sh
,该测试应该仍然保持终端的
stdout
。一旦
test.sh
完成,您可能需要使用一些外部终止信号来停止整个过程

如果您不喜欢这种愚蠢的行为,另一种选择是按照您所描述的那样做:编写一个包装器脚本用作CMD/ENTRYPOINT,让它在没有调试标志的情况下启动SSHD,然后启动
test.sh


使用我发布的脚本执行此操作的优点是,容器将在
test.sh
完成后继续运行,因此您可以登录并四处查看,同时让脚本等待守护进程运行。

RUN
在映像构建时执行命令。运行时启动进程的唯一方法是通过
CMD
(和
ENTRYPOINT
)。您希望执行与您建议的类似的操作,但是您希望去掉
-D
参数,因为您希望ssh进入后台,并且
-D
可以防止出现这种情况。或者您可以执行其他操作。您将使用Dockerfile中的
CMD
/
ENTRYPOINT
运行
sshd
守护进程,就像@larsks之前所说的那样。接下来,在启动容器之后,您可以使用
$docker exec-i[t]…
命令在运行的容器中执行
工具.sh
脚本。希望这能起作用。是否有特定的原因使您的测试驱动程序和被测系统必须是同一个容器?“如何在Docker中运行两个进程”最简单的答案是“在两个单独的容器中”,如果一个进程已经期望与另一个进程建立网络连接,这一点就更加正确了。@DavidMaze提出了一个非常好的观点,运行两个容器可能是与“一个作业”最一致的解决方案轻量级虚拟化技术。
RUN
命令在映像构建时执行。运行时启动进程的唯一方法是通过
CMD
(和
ENTRYPOINT
)。您希望执行与您建议的类似的操作,但是您希望去掉
-D
参数,因为您希望ssh进入后台,并且
-D
可以防止出现这种情况。或者您可以执行其他操作。您将使用Dockerfile中的
CMD
/
ENTRYPOINT
运行
sshd
守护进程,就像@larsks之前所说的那样。接下来,在启动容器之后,您可以使用
$docker exec-i[t]…
命令在运行的容器中执行
工具.sh
脚本。希望这能起作用。是否有特定的原因使您的测试驱动程序和被测系统必须是同一个容器?“如何在Docker中运行两个进程”最简单的答案是“在两个单独的容器中”,如果一个进程已经期望与另一个进程建立网络连接,这一点就更加正确了。@DavidMaze提出了一个非常好的观点,运行两个容器可能是与“一个作业”最一致的解决方案轻量级虚拟化的哲学。