我有一个提交我的应用程序的文件
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-app是从具有以下入口点的Dockerfile构建的
ENTRYPOINT /usr/src/app/docker-entrypoint.shdocker-entrypoint.sh脚本具有启动应用程序所需的命令。然而,我有一些命令,比如迁移数据库模式和播种新数据(我有需要从我的web应用程序容器运行的脚本),这些命令要么只运行一次,要么以较少的频率运行。
例如,开发人员可能希望每个月运行一次迁移脚本,以适应可能发生的任何新模式更改。
我目前的解决方案是在docker-compose.yml的web应用服务中使用环境变量docker-compose.yml,并使用docker-entrypoint.sh中变量的值来决定运行哪个命令。(如果Y,运行迁移命令和通常的启动命令,如果N只运行通常的启动命令)。我想改进这个设计。
docker-compose up init要迁移然后运行,docker-compose up只运行)发布于 2020-02-12 10:36:40
您可以在一个新容器中docker-compose run一个任意命令,该命令(大部分)与您在docker-compose.yml文件中描述的容器中的一个相同
docker-compose run web-app ./manage.py migrate这样做的诀窍是,您的入口点脚本需要确保执行docker run命令的“命令”部分,它作为命令行参数获得。如果它是一个shell脚本,它可以以行结束
exec "$@"在您的Dockerfile中,这意味着您需要同时指定要运行的ENTRYPOINT和默认CMD。ENTRYPOINT必须使用JSON数组形式。CMD可以是JSON数组形式,也可以是裸字符串。
ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"]
CMD ./manage.py runserver 0.0.0.0:8000由于entrypoint脚本最终负责运行整个容器,所以可以编写要运行的命令。您可能已经通过检查$MIGRATE环境变量完成了这一任务。在运行主容器命令之前,通常使用entrypoint脚本作为安装程序来完成这类操作,但是您也可以完全替换命令。
#!/bin/sh
set -e
# Run migrations if requested (possibly in addition to another command)
if [ "$MIGRATE" = "y" ] || [ "$1" = "migrate" ]; then
./manage.py migrate
fi
# Run the `command:`, `CMD`, or command-line command
case "$1" of
migrate)
# already done above
exit 0
;;
seed)
exec ./manage.py loaddata "$@"
;;
*)
exec "$@"
;;
esachttps://stackoverflow.com/questions/60185666
复制相似问题