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

时间:2015-12-17 14:24:51

标签: docker

我正在运行像这样的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'

问题是,我没有获得终端并且命令返回。

1 个答案:

答案 0 :(得分:2)

你正在尝试这个:

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,等待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就好了。