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?这就是我要做的。这是个好主意。如果有多个数据库,我只需要在一个保持活动状态的容器中执行一次。其他人可以链接到它。无论如何,你已经回答了我的问题。谢谢,谢谢