Docker:如何在一个命令中运行一个服务和一个terminal?

我正在运行这样的Apache服务器

docker run -d -p 80:80 php:apache /usr/sbin/apache2ctl -D FOREGROUNDD 

然后我确定容器的名字

 docker ps 

并在容器上执行交互式shell

 docker exec -ti hungry_fermi bash 

它运作良好,但我想在同一个命令。 我试过了

 docker run -ti -d -p 80:80 php:apache /bin/bash -c 'bash; apache2ctl -D FOREGROUND' 

问题是,我没有获得一个terminal,命令返回。

你正在尝试这个:

 docker run -ti -d -p 80:80 php:apache \ /bin/bash -c 'bash; apache2ctl -D FOREGROUND' 

这里有几个问题。 首先,使用-d命令行选项,要求docker客户端分离并保持容器运行。 使用-d时,您将永远不会获得交互式shell。

其次,你的命令 – bash; apache2ctl -D FOREGROUND bash; apache2ctl -D FOREGROUND – 将运行bash,等待bash退出,然后运行httpd 。 你可以改为做这样的事情:

 docker run -ti -p 80:80 php:apache \ /bin/bash -c 'apachectl start; bash' 

这将在后台启动Apache(因为没有-D FOREGROUND ),然后开始bash …但是我不是很清楚为什么你会这样做,因为现在如果你要退出你的shell的容器也会退出(以Apache为例)。

我觉得你现在简单地启动Apache,然后使用docker exec在容器中获得一个shell。