我有一个docker-compose项目,其中每个服务都有其自己的命令以在启动时运行。
我想在docker-compose.yml
中给定的命令之前添加一个额外的命令,该命令仅在首次创建容器时执行。
由于我不确定是否可行,因此在调用docker-compose up
之前手动运行命令也是可以接受的。
给出以下docker-compose.yml
版本:“ 2.3”
version: '2.3'
services:
serv1:
image: my_image
command: some startup command
serv2:
image: my_image
command: some startup command 2
我尝试运行以下内容
$ docker-compose run serv1 my_creation_command
$ docker-compose run serv2 my_creation_command
$ docker-compose up
但这会导致前两个命令创建容器projectname_serv1_run_1
和projectname_serv2_run_1
,第三个命令创建容器projectname_serv1_1
和projectname_serv2_1
这显然是个问题,因为my_creation_command
从未在up
命令创建的容器上运行
任何能够获得仅在创建部分执行自定义命令的解决方案都是可以接受的
答案 0 :(得分:1)
一种可能且简单的解决方案是将init命令包装起来并运行命令到一个唯一的脚本中(我们将其称为init_or_run
):
version: '2.3'
services:
serv1:
image: my_image
command: init_and_run
serv2:
image: my_image
command: init_and_run_2
这些脚本必须处理init和run情况。我已经为数据库完成了此操作(请参见下面的示例)。
init_and_run
的初始情况下,创建数据库/表init_and_run
的运行情况下,只需启动数据库守护程序在这里检查是否必须运行脚本的init部分可能只是在验证数据库是否存在:
if database_does_not_exist
then
create_database_and_tables # init case
fi
run_database_daemon # in both cases, run database daemon
使用此解决方案,您只需要运行docker-compose up
即可启动服务,而无需担心服务是否已初始化,因为init_and_run
脚本将处理两种情况(初始化和运行或仅运行)