代码之家  ›  专栏  ›  技术社区  ›  bluesummers

docker compose在创建容器时插入额外命令

  •  0
  • bluesummers  · 技术社区  · 6 年前

    我有一个docker compose项目,其中每个服务在启动时都有自己的命令。 我想在 docker-compose.yml 只有在第一次创建容器时才会执行。

    因为我不确定这是否可行,所以在调用之前手动运行命令也是可以接受的 docker-compose up .

    鉴于以下情况 docker撰写。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 命令

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   norbjd    6 年前

    一个可能且简单的解决方案是将init命令和run命令包装成一个独特的脚本(我们称之为 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_and_run 的init case,创建数据库/表
    • 在里面 初始化和运行 的运行案例,只需启动数据库守护进程

    在这里检查是否必须运行脚本的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和run或just run)。