【问题标题】:docker-compose insert an extra command upon container creationdocker-compose 在容器创建时插入一个额外的命令
【发布时间】:2019-03-05 16:28:44
【问题描述】:

我有一个 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 命令创建的容器上运行

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

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    一个可能且简单的解决方案是将初始化命令和运行命令包装到一个独特的脚本中(我们称之为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_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 脚本将处理这两种情况(初始化并运行或仅运行)。

    【讨论】:

    • 这是一个很好的方向,但是我没有办法检查my_creation_command是否已经在容器上执行了
    • 你可以在执行my_creation_command之后创建一个虚拟文件,并检查这个文件是否存在以知道my_creation_command是否已经被执行?
    • 我可以,但这是一种肮脏的解决方案,必须有更清洁的东西
    • 我当然同意这一点,我很高兴知道一个更清洁的解决方案 :) 但似乎创建一个同时执行 init 和 run 阶段的脚本是做你想做的事情的唯一方法(检查stackoverflow.com/questions/36407477/…的答案)。但要使用它,您必须知道my_creation_command 是否已被执行。您没有任何方法可以检查 init 命令是否已运行?这个命令到底是做什么的?
    • 该命令运行pip install --upgrade -r requirements,我不希望它每次都运行,只是在创建时运行。我可以检查这些库是否已安装 - 但如果安装了,我仍然希望升级到最新版本
    猜你喜欢
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多