使用Docker-Compose管理多个服务

107

这是一个示例问题!请勿在生产环境中使用。请在单独的容器中运行NGINX/PHP/其他服务!

当我运行docker-compose up时,Ubuntu 容器会退出并显示ubuntu exited with code 0

但是当我运行docker run -d -ti -p 80:80 -v ~/sph/laravel52:/www/laravel ubuntu时,一切正常。

如何使用 Docker Compose 复制此行为?

这是我的 Dockerfile:

# Version: 0.0.1
FROM ubuntu:15.04



ENV DEBIAN_FRONTEND noninteractive

#INSTALL ALL
RUN apt-get update && apt-get install -y  \
       nano \
       php5-fpm \
       php5-mysql \
       nginx



#NGINX CONF
ADD nginx/sites-available/laravel.conf /etc/nginx/sites-available/
RUN rm /etc/nginx/sites-available/default
RUN mv /etc/nginx/sites-available/laravel.conf /etc/nginx/sites-available/default

VOLUME /www


ENTRYPOINT nginx && service php5-fpm start && /bin/bash

CMD ["true"]


EXPOSE 80

还有docker-compose.yml文件:

version: '2'
services:
  ubuntu:
        build: .
        container_name: ubuntu
        volumes:
            - ~/sph/laravel52:/www/laravel
        ports:
          - "80:80"

我明白你可能是有意这样做的:ENTRYPOINT nginx && service php5-fpm start && /bin/bash。但如果你不明白这个决定的含义,可以阅读以下内容:https://github.com/phusion/baseimage-docker。 - Daniel Stefaniuk
图片名称。我的错误。Ubuntu - Tim
我在将 Ruby 添加到 CentOS Dockerfile 中遇到了类似的问题。因此,我使用了“RUN yum update && yum install -y ruby”。 - Kapidis
1个回答

241
您正在运行容器时使用了选项-t。建议您检查一下是否在docker-compose.yml文件中启用了tty选项(请参阅参考文档),以确保容器持续运行。请注意不要删除HTML标签。
version: '2'
services:
  ubuntu:
        build: .
        container_name: ubuntu
        volumes:
            - ~/sph/laravel52:/www/laravel
        ports:
          - "80:80"
        tty: true

4
你在添加了 tty: true 后是否收到了错误信息:ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information. - Winters Huang
1
tty之所以有效是因为它创建了一个伪终端。我曾经遇到过SQL Server 2017容器的类似问题。在独立模式下运行良好,但在多容器场景的docker-compose模式下退出。以下是我使用tty解决该问题的方法:https://www.handsonarchitect.com/2018/01/docker-compose-tip-how-to-avoid-sql.html - Nilesh Gule
@NileshGule 感谢您抽出时间解释 tty 的工作原理,但是如果您不介意的话,我想了解更多。创建伪终端如何确切地防止退出?再次感谢。 - Luis Milanese
3
通常情况下,在 Docker 容器内前台进程完成后,它会认为任务已完成并清理容器实例。但像数据库引擎和 Web 服务器这样的东西需要继续运行。通过创建伪终端,容器可以保持活动状态。您可以通过在是否使用 tty 的情况下运行 docker logs <<容器名称>> 命令来查看此工作流程。 - Nilesh Gule
我的 tty 无法工作...我正在使用 docker-compose 的“3”版本。 - Sanjay Salunkhe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接