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

问题描述 投票:0回答:4

我想用

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
  • 的变体

以及我尝试过的一些参考:

php docker orientdb docker-compose provisioning
4个回答
11
投票

所以 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 不是正确的选择。


8
投票

在使用 compose 运行的 docker 容器上运行 zsh shell 时遇到类似的问题,它将在启动后立即以退出代码 0 关闭。

@Spock 在最后一个答案下面的评论实际上是关键,至少对于我所需要的。

将图像的 docker-compose 命令设置为:

command: tail -f /dev/null

这可以使进程保持活动状态,但也可以正常关闭。


5
投票

如果您使用

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 <containerID> bash
docker attach <container id>

希望这有帮助。


5
投票

加入入口点,让进程不退出

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"
© www.soinside.com 2019 - 2024. All rights reserved.