如何在我的 MySql docker 图像中 运行 Django 种子数据?

How do I run Django seed data in my MySql docker image?

我正在使用 Python 3.7、Django 2 并尝试构建一个 docker 容器来容纳 MySql 和 Django 应用程序图像。我有这个 docker-compose.yml 文件 ...

version: '3'

services:
  web:
    restart: always
    build: ./web
    ports:           # to access the container from outside
      - "8000:8000"
    environment:
      DEBUG: 'true'
    command: /usr/local/bin/gunicorn maps.wsgi:application -w 2 -b :8000

  mysql:
    restart: always
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: 'maps_data'
      # So you don't have to use root, but you can if you like
      MYSQL_USER: 'chicommons'
      # You can use whatever password you like
      MYSQL_PASSWORD: 'password'
      # Password for root access
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - "3406:3406"
    volumes:
      - my-db:/var/lib/mysql

volumes:
  my-db:

这是我的 web/Dockerfile ...

FROM python:3.7-slim

RUN apt-get update && apt-get install

RUN apt-get install -y libmariadb-dev-compat libmariadb-dev
RUN apt-get update \
    && apt-get install -y --no-install-recommends gcc \
    && rm -rf /var/lib/apt/lists/*

RUN python -m pip install --upgrade pip
RUN mkdir -p /app/

WORKDIR /app/

COPY requirements.txt requirements.txt
RUN python -m pip install -r requirements.txt

COPY . /app/

如果我想用 Python 数据为我的 MySql 图像播种,我该如何实现?如果没有 docker,我通常会 运行 这个

python manage.py loaddata maps/fixtures/country_data.yaml

在虚拟环境中。不太确定在我的 docker 图像中执行此命令的位置,甚至应该是什么。

这个命令应该只 运行 一次,而不是每次你想调出你的堆栈时 (docker-compose up)。如果这样做,可能会导致 IntegrityErrors 而这不是您想要的。

如果是这种情况,您可能应该 运行 手动执行该命令。容器启动并 运行ning 后,您可以 运行 像这样的命令:

docker exec {web_container_name} python manage.py loaddata maps/fixtures/country_data.yaml

最好不要将此命令包含在您的 Dockerfile 正文或 entrypoint 本身中。

通知

请务必将 {web_container_name} 替换为正确的名称,您可以通过发出 docker ps 命令找到该名称。

但是

如果您真的想这样做,我建议您考虑在 Dockerfile 中使用 ENTRYPOINT 指令。为此,创建一个名为 entrypoint.sh 的新文件并更改 Dockerfile,如下所示:

entrypoint.sh

#!/bin/bash
set -e

python manage.py loaddata maps/fixtures/country_data.yaml

exec "$@"

Dockerfile

FROM python:3.7-slim

RUN apt-get update && apt-get install

RUN apt-get install -y libmariadb-dev-compat libmariadb-dev
RUN apt-get update \
    && apt-get install -y --no-install-recommends gcc \
    && rm -rf /var/lib/apt/lists/*

RUN python -m pip install --upgrade pip
RUN mkdir -p /app/

WORKDIR /app/

COPY requirements.txt requirements.txt
RUN python -m pip install -r requirements.txt

COPY entrypoint.sh /app/
COPY . /app/
RUN chmod +x entrypoint.sh

ENTRYPOINT ["/app/entrypoint.sh"]