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

Apo*_*llo 10 php provisioning orientdb docker docker-compose

我想用来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"
Run Code Online (Sandbox Code Playgroud)

我的"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
Run Code Online (Sandbox Code Playgroud)

我试过(除其他外):

  • docker-compose up在一个终端然后docker attach在另一个终端
  • 启用tty和stdin_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

真的很感激任何帮助.

谢谢.

L0j*_*j1k 10

所以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
Run Code Online (Sandbox Code Playgroud)

...然后你将从你的PHP图像中启动一个容器,并在容器上获得一个shell(一旦你退出shell就会死掉).但是,再次,从我的第一段重申,docker-compose不是去这里的方式.

  • 这是一个好主意.如果有几个数据库,我只需要做一次 - 在一个保持活着的容器内.其他人可以链接到它. (2认同)

小智 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>

希望这可以帮助.

  • 命令:"tail -f/dev/null"将保持容器一直运行 (3认同)

See*_*ROM 5

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

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

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

command: tail -f /dev/null
Run Code Online (Sandbox Code Playgroud)

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


Rod*_*rry 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"
Run Code Online (Sandbox Code Playgroud)