我想用docker-compose
组合php和几个数据库(orientdb,neo4j等)。然后进入php
容器并使用shell执行命令。
单独地,我的所有容器都在游泳,当我把它们组合在一起时,它们都会运行。但是,我不能为我的生活弄清楚如何让php
容器保持活着,以便我可以进入它进行测试。
为简单起见,我只使用一个数据库: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
在一个终端中,然后docker attach
在另一个终端中tty
和stdin_open
/bin/bash
命令CMD exec vendor/bin/phpunit -D FOREGROUND
我试过的一些参考文献: - How to Keep Docker Container Running After Starting Services? - https://github.com/docker/compose/issues/1926 - https://github.com/docker/compose/issues/423
真的很感激任何帮助。
谢谢。
答案 0 :(得分:10)
所以docker-compose只是docker-engine客户端的替身。它保持与客户端的功能奇偶校验。为了诊断这样的问题,你应该放弃使用docker-compose,直到你使用常规的ole客户端。根据您在此处的评论和其他答案,您只是觉得您没有在前台运行带有守护程序进程的容器。如果要在Docker中运行交互式shell,则必须使用-it
标志(-t
分配tty,-i
启动交互式会话。如果您不使用这些交换机运行Docker,那么您启动交互式shell时容器将无法生存,例如: php -a
。
将Docker视为运行流程而非虚拟机的一种奇特方式会有所帮助。它不是一些环境"存在于您正在运行的任何进程(及其子进程)的生命周期之外。通常,PHP由某些服务器(例如Apache,Nginx等)调用。你在这里暗示的是你需要一个PHP流程来永久地运行#34;这样你就可以放入容器并测试一些东西。除了交互式shell之外,这是不可能的,并且您需要专门使用-it
开关来保持容器中的交互式shell进程。这里真正的答案是,你不能做你在这里尝试做的事情(保持PHP容器运行),而不需要在前台监听一些相关的守护进程/服务器进程。原因是因为这不是PHP的工作方式。如果确实希望从PHP映像进入容器,只需将其放入shell中:
docker run -it apollo/php /bin/bash
...您将从PHP映像启动一个容器,并在容器上获取一个shell(一旦退出shell就会死掉)。但是,再次,从我的第一段重申,docker-compose不是去这里的方式。
答案 1 :(得分:5)
如果您使用docker-compose up
运行并且没有错误打印到终端,则表明服务正在停止,因为它已完成(而不是遇到某些错误)。
错误的一个潜在原因是您正在向PHP发送内容(安装编写器),这会杀死php:5.6-cli
图像触发的交互式php终端。要再次启动交互式php shell,请将以下内容添加到Dockerfile的末尾:
CMD ["php", "-a"]
并使用docker-compose up
旁注:当一切正常运行时,您可以运行docker-compose up -d
以守护进程模式运行,让您再次控制终端(所有stdout + stderr将记录在docker容器中各自的日志文件)。
然后你可以附加到容器来做你的事情。我总是发现docker exec -it <containerID> bash
比docker attach <container id>
希望这有帮助。
答案 2 :(得分:3)
在使用compose运行的docker容器上运行zsh shell时遇到类似问题,它会在启动后立即关闭退出代码0。
@ Spock在最后一个答案下面的评论实际上是关键,至少在我需要的时候。
将图像的docker-compose命令设置为:
command: tail -f /dev/null
这使进程保持活动状态,但也允许它正常关闭。
答案 3 :(得分:2)
加入入口点,以便进程不会退出
version: "3.7"
services:
debug-srv:
container_name: "debug-srv"
image: "alpine:latest"
entrypoint: ["tail", "-f", "/dev/null"]
networks:
debug-net:
networks:
debug-net:
name: "debug-net"