Frequently asked questions

预计阅读时间:4分钟

如果您在此处没有看到您的问题,请随时在Docker 社区 Slack上通过#docker-compose访问.

Can I control service startup order?

是 - 请参阅控制启动顺序.

Why do my services take 10 seconds to recreate or stop?

Compose stop 尝试通过发送SIGTERM来停止容器. 然后它等待10 秒的默认超时. 超时后,会向容器发送SIGKILL以强制杀死它. 如果您正在等待此超时,则意味着您的容器在收到SIGTERM信号时并未关闭.

已经有很多关于进程在容器中处理信号的问题的文章.

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

  • 确保在 Dockerfile 中使用CMDENTRYPOINT的 exec 形式.

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

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

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

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

How do I run multiple copies of a Compose file on the same host?

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

What’s the difference between up, run, and start?

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

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

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

Can I use json instead of yaml for my Compose file?

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

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

Should I include my code with COPY/ADD or a volume?

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

如果您想对代码进行更改并立即看到它们的反映,您应该使用volume ,例如,当您正在开发代码并且您的服务器支持热代码重新加载或实时重新加载时.

在某些情况下,您可能想同时使用两者. 您可以使用COPY让图像包含代码,并使用 Compose 文件中的volume在开发期间包含来自主机的代码. 卷会覆盖映像的目录内容.

Where can I find example compose files?

GitHub 上有很多 Compose 文件的示例.

Compose documentation

documentation, docs, docker, compose, faq

by  icopy.site