首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用docker-组合来执行一次性/较少频繁的命令?

如何使用docker-组合来执行一次性/较少频繁的命令?
EN

Stack Overflow用户
提问于 2020-02-12 10:00:17
回答 1查看 844关注 0票数 1

我有一个提交我的应用程序的文件

代码语言:javascript
复制
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构建的

代码语言:javascript
复制
ENTRYPOINT /usr/src/app/docker-entrypoint.sh

docker-entrypoint.sh脚本具有启动应用程序所需的命令。然而,我有一些命令,比如迁移数据库模式和播种新数据(我有需要从我的web应用程序容器运行的脚本),这些命令要么只运行一次,要么以较少的频率运行。

例如,开发人员可能希望每个月运行一次迁移脚本,以适应可能发生的任何新模式更改。

我目前的解决方案是在docker-compose.yml的web应用服务中使用环境变量docker-compose.yml,并使用docker-entrypoint.sh中变量的值来决定运行哪个命令。(如果Y,运行迁移命令和通常的启动命令,如果N只运行通常的启动命令)。我想改进这个设计。

  • 我可以创建自定义的坞-组合命令吗?(docker-compose up init要迁移然后运行,docker-compose up只运行)
  • 还有其他更好的方法来实现吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-12 10:36:40

您可以在一个新容器中docker-compose run一个任意命令,该命令(大部分)与您在docker-compose.yml文件中描述的容器中的一个相同

代码语言:javascript
复制
docker-compose run web-app ./manage.py migrate

这样做的诀窍是,您的入口点脚本需要确保执行docker run命令的“命令”部分,它作为命令行参数获得。如果它是一个shell脚本,它可以以行结束

代码语言:javascript
复制
exec "$@"

在您的Dockerfile中,这意味着您需要同时指定要运行的ENTRYPOINT和默认CMDENTRYPOINT必须使用JSON数组形式。CMD可以是JSON数组形式,也可以是裸字符串。

代码语言:javascript
复制
ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"]
CMD ./manage.py runserver 0.0.0.0:8000

由于entrypoint脚本最终负责运行整个容器,所以可以编写要运行的命令。您可能已经通过检查$MIGRATE环境变量完成了这一任务。在运行主容器命令之前,通常使用entrypoint脚本作为安装程序来完成这类操作,但是您也可以完全替换命令。

代码语言:javascript
复制
#!/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 "$@"
    ;;
esac
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60185666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档