经常问的问题
预计阅读时间: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
如何在同一主机上运行Compose文件的多个副本?
Compose使用项目名称为项目的所有容器和其他资源创建唯一的标识符。要运行一个项目的多个副本,请使用-p
命令行选项
或COMPOSE_PROJECT_NAME
环境变量来设置自定义项目名称。
什么之间的区别up
,run
以及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
或一个卷吗?
您可以在中使用COPY
或ADD
指令将代码添加到图像中
Dockerfile
。如果您需要将代码与Docker映像一起重定位,例如在将代码发送到另一个环境(生产环境,CI等)时,这很有用。
volume
如果要更改代码并立即看到更改,例如在开发代码并且服务器支持热代码重载或实时重载时,应使用a 。
在某些情况下,您可能要同时使用两者。您可以使用来使图像包含代码COPY
,并volume
在Compose文件中使用来在开发过程中包含来自主机的代码。该卷将覆盖映像的目录内容。