保持容器活着并使用docker-compose链接

我想用docker-compose来组合php和几个数据库(orientdb,neo4j等)。 然后进入php容器并使用shell执行命令。

个别地,我所有的容器都是水stream运行的,当我把它们合在一起的时候,它们都运行着。 但是,我不能为了我的生活找出如何保持php容器活着,所以我可以进入testing。

为了简单起见,我只使用一个数据库:orient-db。

docker-compose.yml文件:

 version: '2' services: php: build: . links: - orientdb orientdb: image: orientdb:latest environment: ORIENTDB_ROOT_PASSWORD: rootpwd ports: - "2424:2424" - "2480:2480" 

我的“PHP” Dockerfile

 FROM php:5.6-cli ADD . /spider WORKDIR /spider RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer RUN composer install --prefer-source --no-interaction RUN yes | pecl install xdebug \ && echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini 

我曾尝试(除其他外):

  • docker-compose up在一个terminal组成,然后docker attach在另一个
  • 在我的撰写文件中启用ttystdin_open
  • 使用/bin/bash命令
  • CMD exec vendor/bin/phpunit -D FOREGROUND

还有一些我曾经尝试过的引用: – 如何让Docker容器在启动服务后运行? – https://github.com/docker/compose/issues/1926 – https://github.com/docker/compose/issues/423

任何帮助真的不胜感激。

谢谢。

所以docker-compose只是docker-engine客户端的一个替身。 它保持与客户的function平等。 为了诊断这样的问题,你应该放弃使用docker-compose,直到你使用普通的ole客户端。 根据你在这里和其他答案的意见,这听起来像你没有在前台运行一个守护进程的容器。 如果要在Docker中运行交互式shell,则必须使用-it标志( -t分配tty, -i启动交互式会话)。 如果您不使用这些开关运行Docker,则启动交互式shell的容器将无法生存,例如php -a

这有助于将Docker视为运行进程而不是虚拟机的奇特方式。 这不是在你运行的任何进程(及其子)的生命之外存在的某种“环境”。 通常情况下,PHP是由某个服务器(例如Apache,Nginx等)调用的。 你在这里暗示的是,你需要一个PHP进程来“永久”运行,以便你可以放入容器并testing一些东西。 除了交互式shell,这是不可能的,你需要专门使用-it开关来保持你的容器中的交互式shell进程。 这里真正的答案是,你不能在这里做你正在做的事情(保持一个PHP容器的运行)而没有一些相关的守护进程/服务器进程在前台监听。 原因是因为这不是PHP的工作原理。 如果你真的想从你的PHP映像进入一个容器,只需放入一个shell:

 docker run -it apollo/php /bin/bash 

…你将从你的PHP镜像启动一个容器,并在容器上获得一个shell(一旦你退出shell就会死掉)。 但是,再次重申,从我的第一段来看,docker写作并不是要走的路。

如果你运行docker-compose up ,并且没有打印到terminal上的错误,那么表明服务正在停止,因为它已经完成(而不是遇到一些错误)。

导致错误的一个潜在原因是你正在向PHP(安装composer)发送东西,这将杀死由php:5.6-cli图像触发的交互式phpterminal。 要再次启动交互式php shell,请将以下内容添加到Dockerfile的末尾:

CMD ["php", "-a"]

然后用docker-compose up再次尝试

旁注:当一切运行正常时,你可以运行docker-compose up -d以守护进程模式运行,再次控制你的terminal(所有的stdout + stderr都将被logging在docker容器的相应日志文件中)。

然后,您可以附加到容器来做你的事情。 我总是发现docker exec -it <containerID> bashdocker attach <container id>更快

希望这可以帮助。

如果在运行compose的docker容器上运行一个zsh shell,类似的问题会在启动后立即closures,退出代码0。

@ Spock在最后一个答案下的评论其实是关键,至less是我所需要的。

将你的docker-compose命令设置为:

 command: tail -f /dev/null 

这使进程保持活动状态,但也允许它正常closures。

Interesting Posts