Как запустить Django начальные данные в моем MySql docker образе? - PullRequest
0 голосов
/ 09 февраля 2020

Я использую 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:

Вот мой веб / 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/

Если я хочу заполнить мой MySql изображение с Python данными, как бы мне этого добиться? Без docker я бы обычно запускал этот

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

в виртуальной среде. Не совсем уверен, где эта команда будет go, или даже какой она должна быть, чтобы сделать это в моем docker образе.

1 Ответ

1 голос
/ 10 февраля 2020

Эта команда, вероятно, должна выполняться только один раз, а не каждый раз, когда вы хотите вызвать свой стек (docker-compose up). Если вы сделаете это, это может вызвать IntegrityError s, а это не то, что вам нужно.

В этом случае вам, вероятно, следует выполнить эту команду вручную. После того, как контейнеры запущены и работают, вы можете выполнить команду следующим образом:

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

Лучше не включать эту команду в ваше тело Dockerfile или entrypoint как таковое.

Уведомление

Обязательно замените {web_container_name} на правильное имя, которое вы сможете найти, введя команду docker ps.

Но

Если вы действительно хотите это сделать, я рекомендую вам использовать директиву ENTRYPOINT в вашем Dockerfile. Для этого создайте новый файл с именем entrypoint.sh и измените Dockerfile, как показано ниже:

точка входа. 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"]
...