【发布时间】:2021-01-16 06:23:39
【问题描述】:
我有一个带有 Docker 的 Django 应用程序
我想在运行 docker-compose up 时根据 init.sql 文件初始化我的数据库
2 个容器已正确构建,init.sql 文件在 db_container 中可用
但docker logs db_container 显示错误,表明数据库尚未迁移:
错误:关系表 1 不存在
执行entrypoint.sh文件时创建数据库(命令python manage.py migrate)
不明白init.db什么时候执行?
Dockerfile
FROM python:3.8.3-alpine
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev
RUN apk --update add libxml2-dev libxslt-dev libffi-dev gcc musl-dev libgcc openssl-dev curl
RUN apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev
RUN pip3 install psycopg2 psycopg2-binary
COPY requirements/ requirements/
RUN pip install --upgrade pip && pip install -r requirements/dev.txt
COPY ./entrypoint.sh .
COPY . .
# Run entrypoint.sh
ENTRYPOINT [ "/usr/src/app/entrypoint.sh" ]
entrypoint.sh
#!/bin/sh
if [ "$DATABASE" = "postgres" ]
then
echo "Waiting for postgres..."
# nc = netcap -z = scanning
while ! nc -z $SQL_HOST $SQL_PORT; do
sleep 0.1
done
echo "PostgreSQL started"
fi
python manage.py flush --no-input
python manage.py migrate
exec "$@"
docker-compose.yml
version: '3.7'
services:
web:
...
depends_on:
- db
db:
image: postgres:12.0-alpine
restart: always
volumes:
- postgres_data:/var/lib/postgres/data/
- ./imports/init.sql:/docker-entrypoint-initdb.d/init.sql
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=user
- POSTGRES_DB=db_dev
volumes:
postgres_data:
init.sql
\c db_dev
INSERT INTO table1 (field1,field2,field3) VALUES ('value1','value2','value3');
...
【问题讨论】:
标签: django docker docker-compose