Php 使用docker compose使容器保持活动状态并链接
我想使用Php 使用docker compose使容器保持活动状态并链接,php,docker,orientdb,docker-compose,provisioning,Php,Docker,Orientdb,Docker Compose,Provisioning,我想使用docker compose组合php和几个数据库(orientdb、neo4j等)。然后进入php容器并使用shell执行命令 单独而言,我的所有容器都工作顺利,当我将它们组合在一起时,它们都会运行。然而,我一辈子都不知道如何让php容器保持活动状态,以便进入它进行测试 为了简单起见,我只使用一个数据库:orient db 我的docker compose.yml文件: version: '2' services: php: build: . links:
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在一个终端上合成
- 在我的撰写文件中启用
和tty
stdin\u open
- 使用
命令/bin/bash
CMD exec vendor/bin/phpunit-D前台的变体
谢谢。如果您使用
docker compose up运行,并且终端上没有打印错误,则表明服务正在停止,因为它已完成(而不是遇到一些错误)
出现错误的一个潜在原因是,您正在向PHP(安装composer)发送内容,这将杀死由PHP:5.6-cli
映像触发的交互式PHP终端。要再次启动交互式php shell,请在Dockerfile的末尾添加以下内容:
CMD[“php”,“-a”]
然后使用docker compose up重试
侧注:当一切正常运行时,您可以运行docker compose up-d
以守护程序模式运行,再次控制您的终端(所有stdout+stderr都将记录在docker容器各自的日志文件中)
然后,您可以连接到容器来完成您的任务。我总是发现docker exec-it bash
比docker attach
希望这有帮助。所以docker compose只是docker engine客户端的替身。它与客户端保持功能奇偶性。为了诊断这样的问题,您应该停止使用docker compose,直到它与常规ole客户端一起工作。根据您在这里的评论和另一个答案,听起来您并没有在前台运行带有守护进程的容器。如果要在Docker中运行交互式shell,必须使用-it
标志(-t
分配tty和-i
启动交互式会话)。如果您不使用这些开关运行Docker,那么您的容器将无法在启动交互式shell(例如php-a
)后继续运行
这有助于将Docker视为一种运行进程而不是虚拟机的奇特方式。它不是在您正在运行的任何进程(及其子进程)的生命周期之外存在的某个“环境”。通常,PHP由某些服务器(例如Apache、Nginx等)调用。这里的意思是,您需要一个PHP进程“永久”运行,这样您就可以放入容器并测试一些东西。除了交互式shell之外,这是不可能的,您需要特别使用-it
开关来保持容器中的交互式shell进程处于活动状态。这里真正的答案是,如果没有一些相关的守护进程/服务器进程在前台监听,您就无法完成您在这里试图做的事情(保持PHP容器运行)。这是因为PHP不是这样工作的。如果您真的想从PHP图像进入容器,只需将其放入shell即可:
docker run -it apollo/php /bin/bash
。。。您将从PHP图像启动一个容器,并在容器上获得一个shell(一旦退出shell,它就会消失)。但是,再次重申,从我的第一段开始,docker compose并不是解决问题的方法。在使用compose运行的docker容器上运行zsh shell时遇到了类似的问题,它会在启动后立即关闭,退出代码为0
@斯波克在最后一个答案下面的评论实际上是关键,至少对于我所需要的
将图像的docker compose命令设置为:
command: tail -f /dev/null
这将使进程保持活动状态,但也允许它正常关闭。加入入口点,使进程不会退出
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"
请添加PHP容器的日志粘贴。我们需要看看它是如何消亡的。@L0j1k当我运行docker日志时,我得到的只是interactiveshell`。容器正在正确构建,刚完成就退出。我需要一个命令来运行,使它保持打开状态。我尝试了@tfg answer,但没有成功。请看这里-刚刚找到了一个简单有效的方法:另外,您可以尝试使用php:5.6-apache
image,因为默认情况下apache进程正在运行,不会退出。我尝试了一些变化,但没有成功。你是对的。当我运行docker ps-a
时,它显示php已退出。我只是尝试将命令:[“sleep”,“60”]
添加到我的yml文件中,它使容器保持了整整一分钟的打开状态,在此期间我可以exec
incommand:“tail-f/dev/null”将使容器一直运行,这很有意义,这就是我所担心的。我可以使用这些标志让php保持打开状态。我只是希望我可以使用compose将我的容器链接在一起。php容器需要能够与orientdb容器通信。这可能是一个单独的问题,您是否考虑过在OrientDB容器中安装PHP?这就是我要做的。这是个好主意。如果有多个数据库,我只需要在一个保持活动状态的容器中执行一次。其他人可以链接到它。无论如何,你已经回答了我的问题。谢谢,谢谢