如何在我的 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
)。如果这样做,可能会导致 IntegrityError
s 而这不是您想要的。
如果是这种情况,您可能应该 运行 手动执行该命令。容器启动并 运行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"]
我正在使用 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
)。如果这样做,可能会导致 IntegrityError
s 而这不是您想要的。
如果是这种情况,您可能应该 运行 手动执行该命令。容器启动并 运行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"]