docker-compose在创建容器时插入一个额外的命令

时间:2018-09-30 08:43:58

标签: docker docker-compose

我有一个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_1projectname_serv2_run_1,第三个命令创建容器projectname_serv1_1projectname_serv2_1

这显然是个问题,因为my_creation_command从未在up命令创建的容器上运行

任何能够获得仅在创建部分执行自定义命令的解决方案都是可以接受的

1 个答案:

答案 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脚本将处理两种情况(初始化和运行或仅运行)