docker compose在创建容器时插入额外命令
我有一个docker compose项目,其中每个服务在启动时都有自己的命令。 我想在docker compose.yml中给出的命令之前添加一个额外的命令,该命令仅在首次创建容器时执行 因为我不确定这是否可行,所以在调用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 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案例中,创建数据库/表init\u和\u run
- 在
的运行案例中,只需启动数据库守护进程init\u和\u run
如果数据库不存在
然后
创建_数据库_和_表#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