代码之家  ›  专栏  ›  技术社区  ›  Santhosh

docker compose和docker:只需第一次使用虚拟数据初始化。最好的方法是什么

  •  0
  • Santhosh  · 技术社区  · 3 年前

    我有一个django docker映像,并使用docker compose与postgresql一起启动它。

    # docker-compose -p torsha-single -f ./github/docker-compose.yml --project-directory ./FINAL up --build --force-recreate --remove-orphans
    
    # docker-compose -p torsha-single -f ./github/docker-compose.yml --project-directory ./FINAL exec fastapi /bin/bash
    
    # My version of docker = 18.09.4-ce
    # Compose file format supported till version 18.06.0+ is 3.7
    version: "3.7"
    services:
    
    
      postgresql:
        image: "postgres:13-alpine"
        restart: always
        volumes:
          - type: bind
            source: ./DO_NOT_DELETE_postgres_data
            target: /var/lib/postgresql/data
        environment:
          POSTGRES_DB: project
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: abc123
          PGDATA: "/var/lib/postgresql/data/pgdata"
        networks:
          - postgresql_network
    
      webapp:
        image: "django_image"
        depends_on:
          - postgresql
        ports:
          - 8000:8000
        networks:
          - postgresql_network
    
    
    networks:
      postgresql_network:
        driver: bridge
    

    docker-compose up 这是我第一次必须使用

    docker-compose exec webapp sh -c 'python manage.py migrate';
    docker-compose exec webapp sh -c 'python manage.py shell < useful_scripts/intialize_dummy_data.py'
    

    在这之后的任何时候,我都不需要做以上的事情。

    将此脚本放置在何处,以便它检查是否第一次运行这些命令。

    1 回复  |  直到 3 年前
        1
  •  1
  •   gview    3 年前

    docker-compose run 是针对这类问题设计的。将其与-rm标志配对,以便在命令完成时删除容器。常见的例子是执行您试图完成的那种迁移和初始化。

    这是docker compose run命令手册页面的右侧:

    docker-compose run --rm web python manage.py db upgrade
    

    您可以将其视为一种一次性容器,只执行一项任务,然后退出。此技术也可用于带有cron的计划作业。

        2
  •  1
  •   David Maze    3 年前

    Django文档对 Providing initial data for models 就是把它写成一个 data migration . 这将在运行时自动加载数据 manage.py migrate . 与其他迁移一样,Django记录了它已在数据库中运行的事实,因此不会再次运行它。

    这样,当应用程序启动时,就可以减少需要运行迁移的问题。您可以编写一个shell脚本,首先运行迁移,然后运行其他一些作为参数传递的命令:

    #!/bin/sh
    python manage.py migrate
    exec "$@"
    

    这正是一份工作所需的表格 Docker ENTRYPOINT script COPY 将此脚本与应用程序的其余部分一起设置 入口点 运行此脚本,并设置 CMD

    COPY . .                                     # probably already there
    ENTRYPOINT ["./entrypoint.sh"]               # must be JSON-array form
    CMD python manage.py runserver 0.0.0.0:8000  # unchanged
    

    (如果您已经有一个入口点包装器脚本,请在那里添加迁移行。如果Dockerfile以某种方式拆分 指令 ,将它们组合成一个 指令 .)

    完成此操作后,容器将在启动时自行运行迁移。如果这是容器第一次运行,它还将加载种子数据。你不需要任何人工干预。

    推荐文章