经常问的问题

预计阅读时间:4分钟

如果您在这里没有看到您的问题,请随时#docker-compose访问freenode IRC并询问社区。

我可以控制服务启动顺序吗?

是-请参阅控制启动顺序

为什么我的服务需要10秒钟才能重新创建或停止?

撰写stop尝试,通过发送停止容器SIGTERM。然后,它等待10秒默认超时。超时后,将aSIGKILL发送到容器以强制杀死它。如果您正在等待此超时,则意味着您的容器在收到SIGTERM信号后不会关闭。

关于处理 容器中信号过程的问题已经有很多文章了 。

要解决此问题,请尝试以下操作:

  • 确保您使用的EXEC形式CMD,并ENTRYPOINT 在你的Dockerfile。

    例如使用["program", "arg1", "arg2"]not "program arg1 arg2"。使用字符串形式会使Docker运行bash无法正确处理信号的进程。Compose始终使用JSON格式,因此如果您覆盖Compose文件中的命令或入口点,请不要担心。

  • 如果可以,请修改正在运行的应用程序,为添加一个显式信号处理程序SIGTERM

  • 将设置为stop_signal应用程序知道如何处理的信号:

services:
  web:
    build: .
    stop_signal: SIGINT
  • 如果您无法修改应用程序,请将应用程序包装在轻量级的init系统(如s6)或信号代理(如 dumb-inittini)中。这些包装器中的任何一个都SIGTERM妥善处理。

如何在同一主机上运行Compose文件的多个副本?

Compose使用项目名称为项目的所有容器和其他资源创建唯一的标识符。要运行一个项目的多个副本,请使用-p命令行选项COMPOSE_PROJECT_NAME环境变量来设置自定义项目名称。

什么之间的区别uprun以及start

通常,您需要docker-compose up。使用up启动或重新启动所有定义的服务docker-compose.yml。在默认的“附加”模式下,您将看到来自所有容器的所有日志。在“分离”模式(-d)中,启动容器后Compose退出,但是容器继续在后台运行。

docker-compose run命令用于运行“一次性”或“临时”任务。它需要您要运行的服务名称,并且仅启动正在运行的服务所依赖的服务的容器。使用run运行测试或执行管理任务,如删除或添加数据的数据量的容器。该run命令的行为类似于docker run -ti,它向容器打开了一个交互式终端,并返回与容器中进程的退出状态匹配的退出状态。

docker-compose start命令仅对重新启动先前创建但已停止的容器有用。它永远不会创建新的容器。

我可以在撰写文件中使用json而不是yaml吗?

是的。Yaml是json的超集,因此任何JSON文件都应为有效的Yaml。要将JSON文件与Compose一起使用,请指定要使用的文件名,例如:

$ docker-compose -f docker-compose.json up

我应该在代码中添加一个COPY/ADD或一个卷吗?

您可以在中使用COPYADD指令将代码添加到图像中 Dockerfile。如果您需要将代码与Docker映像一起重定位,例如在将代码发送到另一个环境(生产环境,CI等)时,这很有用。

volume如果要更改代码并立即看到更改,例如在开发代码并且服务器支持热代码重载或实时重载时,应使用a 。

在某些情况下,您可能要同时使用两者。您可以使用来使图像包含代码COPY,并volume在Compose文件中使用来在开发过程中包含来自主机的代码。该卷将覆盖映像的目录内容。

在哪里可以找到示例撰写文件?

GitHub上许多Compose文件的示例

撰写文件

文档docsdockercompose常见问题