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

docker compose在创建容器时插入额外命令,docker,docker-compose,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

我有一个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\u serv1\u run\u 1
projectname\u serv2\u run\u 1
,第三个命令创建
projectname\u serv1\u 1
projectname\u serv2\u 1

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


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

一个可能且简单的解决方案是将init命令和run命令包装成一个唯一的脚本(我们称之为
init\u或\u run
):

这些脚本必须处理init和运行案例。我已经为数据库完成了这项工作(参见下面的示例)

示例(带有数据库)
  • init\u和\u run
    的init案例中,创建数据库/表
  • init\u和\u run
    的运行案例中,只需启动数据库守护进程
检查是否必须在此处运行脚本的init部分可能只是验证数据库是否存在:

如果数据库不存在
然后
创建_数据库_和_表#init case
fi
运行_database_daemon#在这两种情况下,运行数据库daemon

使用此解决方案,您只需运行
docker compose up
即可启动服务,而不必关心服务是否已初始化,因为
init_和_run
脚本将处理这两种情况(init和run或just run)。

这是一个很好的方向,但是我没有办法检查
我的创建\u命令
是否已经在一个容器上执行了。你能在执行
我的创建\u命令
之后创建一个虚拟文件,并检查这个文件是否存在,以知道
我的创建\u命令
是否已经执行了吗?我可以,但这是一种肮脏的解决方案,我当然同意这一点,而且我很高兴知道一个更干净的解决方案:)但似乎创建一个同时执行init和run阶段的脚本是实现所需的唯一方法(请查看的答案)。但要使用该命令,您必须知道是否执行了
my\u creation\u命令。难道您没有任何方法来检查init命令是否已运行吗?这个命令到底是做什么的?这个命令运行一个
pip安装--upgrade-r requirements
,我不希望每次都运行它,就在创建它的时候。我可以检查库是否已安装,但如果已安装,我仍希望升级到最新版本
version: '2.3'

services:

  serv1:
    image: my_image
    command: init_and_run

  serv2:
    image: my_image
    command: init_and_run_2