如何使用docker compose up执行一次性/不太频繁的命令
我有一个docker compose up文件,用于启动我的应用程序如何使用docker compose up执行一次性/不太频繁的命令,docker,docker-compose,Docker,Docker Compose,我有一个docker compose up文件,用于启动我的应用程序 version: '3' services: web-app: build: . volumes: - .:/usr/src/app ports: - "36081:36081" restart: always environment: MIGRATE: Y DB_1_HOST: db1 DB_1_PORT: 3306
version: '3'
services:
web-app:
build: .
volumes:
- .:/usr/src/app
ports:
- "36081:36081"
restart: always
environment:
MIGRATE: Y
DB_1_HOST: db1
DB_1_PORT: 3306
DB_2_HOST: db2
DB_2_PORT: 3306
db1:
image: mysql/mysql-server:5.7
environment:
MYSQL_DATABASE: config_dev
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- ./docker/images/db1/sql-scripts:/docker-entrypoint-initdb.d
- db1-volume:/var/lib/mysql
restart: always
ports:
- "1200:3306"
db1:
image: mysql/mysql-server:5.7
environment:
MYSQL_DATABASE: config_dev
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- ./docker/images/db2/sql-scripts:/docker-entrypoint-initdb.d
- db2-volume:/var/lib/mysql
restart: always
ports:
- "1201:3306"
web应用程序是从具有以下入口点的Dockerfile构建的
ENTRYPOINT /usr/src/app/docker-entrypoint.sh
docker entrypoint.sh
脚本包含启动应用程序所需的命令。但是,我有一些命令,比如迁移数据库模式和播种新数据(我有一些脚本用于需要从web应用程序容器中运行的数据),这些命令只需运行一次,或者比其他命令运行的频率要低。
例如,开发人员可能希望每月运行一次迁移脚本,以适应可能发生的任何新模式更改。
我目前的解决方案是在
docker compose.yml
的web应用程序服务中使用环境变量MIGRATE
,并使用docker entrypoint.sh
中变量的值来决定运行哪个命令。(如果为Y,则将migrate命令与常规启动命令一起运行,如果为N,则仅运行常规启动命令)。我想改进这个设计
- 我可以创建自定义docker compose命令吗?(
要迁移然后运行,docker compose up init
仅运行)docker compose up
- 有没有其他更好的方法来实现这一点
docker compose.yml
文件中描述的容器相同的新容器中执行任意命令
docker-compose run web-app ./manage.py migrate
这样做的诀窍是,入口点脚本需要确保执行docker run
命令的“command”部分,该部分作为命令行参数获取。如果它是一个shell脚本,它可以以行结尾
exec "$@"
在Dockerfile中,这意味着您需要指定要运行的ENTRYPOINT
和默认CMD
。入口点必须使用JSON数组形式CMD
可以是JSON数组形式,也可以是空字符串
ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"]
CMD ./manage.py runserver 0.0.0.0:8000
由于entrypoint脚本最终负责运行整个容器,因此您可以编写要运行的命令。您可能已经通过检查$MIGRATE
环境变量实现了这一点。在运行main container命令之前,通常使用entrypoint脚本作为安装程序来执行这类操作,但也可以完全替换该命令
#/垃圾箱/垃圾箱
set-e
#如果请求,运行迁移(可能除了另一个命令之外)
如果[“$MIGRATE”=“y”]| |[“$1”=“MIGRATE”];然后
./manage.py迁移
fi
#运行`command:`、`CMD`或命令行命令
案件“$1”
迁移)
#上面已经做过了
出口0
;;
种子)
exec./manage.py loaddata“$@”
;;
*)
执行官“$@”
;;
以撒
非常感谢,我也将浏览文档中的docker compose run
!嘿,你能澄清一下ENTRYPOINT和CMD在这种情况下有什么不同吗?CMD作为参数传递给ENTRYPOINT;该组合命令(此处为docker-entrypoint.sh/bin/sh-c'python manage.py runserver 0.0.0.0:8000
)是主容器进程。在Dockerfile中,文档将详细介绍。您可以在运行时分别覆盖这两个部分,如果docker在仅覆盖CMD的编写上下文之外运行imagename some命令
。使用docker Compose run
我无法启动从属服务入口点,因此我无法运行我的命令。解决这个问题的办法是什么?这里描述了这个问题