Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用docker compose up执行一次性/不太频繁的命令_Docker_Docker Compose - Fatal编程技术网

如何使用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

我有一个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
      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
我无法启动从属服务入口点,因此我无法运行我的命令。解决这个问题的办法是什么?这里描述了这个问题