如何使Docker构建运行python manage.py migrate。
如何使Docker构建运行python manage.py migrate。
我对Docker非常陌生,正试图与Django一起使用它,这是我的DockerFile:
FROM python:3.6 RUN mkdir /app WORKDIR /app ADD . /app/ ENV PYTHONUNBUFFERED 1 ENV LANG C.UTF-8 ENV DEBIAN_FRONTEND=noninteractive ENV PORT=8000 RUN apt-get update && apt-get install -y --no-install-recommends \ tzdata \ python3-setuptools \ python3-pip \ python3-dev \ python3-venv \ git \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* RUN pip3 install --upgrade pip RUN pip3 install pipenv RUN pip install -r requirements.txt && python manage.py migrate EXPOSE 8888 CMD gunicorn g_attend.wsgi:application --bind 0.0.0.0:$PORT
它正常工作,但从不进行迁移,有没有帮助?
注意:如果问题是一个初学者问题,请原谅,这是我第一次使用Docker,找不到关于Docker/Django的清晰文档。
问题的原因是entrypoint.sh
没有按预期工作。解决方法是在docker-compose文件中添加迁移命令行。下面是最终的文件内容:
Dockerfile
FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code COPY requirements.txt /code/ COPY entrypoint.sh /code/ RUN pip install -r requirements.txt COPY . /code/
docker-compose.yml
version: '3'
services:
db:
image: postgres
web:
build: .
command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
最终,问题得到解决。但是这种方式不易管理。另外,不要使用makemigrations
命令,在构建之前应该已经生成迁移文件。此外,在生产环境中应该使用gunicorn。
问题出现的原因是在Dockerfile中运行迁移命令,而正确的做法是创建一个entrypoint.sh脚本来运行迁移命令。解决方法是将迁移命令放在entrypoint.sh脚本中,并在Dockerfile中调用该脚本。
具体的解决步骤如下:
1. 首先,在Dockerfile中添加以下代码,用于安装系统依赖和设置工作目录:
FROM python:3.6.8
RUN apt-get update;
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
ADD requirements.txt /code
ADD entrypoint.sh /code
WORKDIR /code
RUN chmod +x *.sh
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . /code
2. 创建一个名为entrypoint.sh的脚本文件,并将以下代码复制进去:
#!/bin/bash set -e echo "${0}: running migrations." python manage.py makemigrations --merge python manage.py migrate --noinput echo "${0}: collecting statics." python manage.py collectstatic --noinput cp -rv static/* static_shared/ gunicorn yourapp.wsgi:application \ --env DJANGO_SETTINGS_MODULE=yourapp.production_settings \ --name yourapp \ --bind 0.0.0.0:8000 \ --timeout 600 \ --workers 4 \ --log-level=info \ --reload
3. 确保entrypoint.sh和Dockerfile文件与manage.py在同一个文件夹中。
4. 使用docker-compose来组织部署,创建一个名为docker-compose.yml的文件,并将以下代码复制进去:
version: '3'
web:
build:
context: .
dockerfile: Dockerfile
command:
- /bin/sh
- '-c'
- '/code/entrypoint.sh'
ports:
- '8000:8000'
volumes:
- '.:/code'
- 'media_volume:/media'
5. 运行以下命令构建和运行docker容器:
docker-compose up --build
如果出现错误信息"/bin/sh: 1: /code/entrypoint.sh: not found",请确保Dockerfile和entrypoint.sh文件在主应用程序文件夹中,并重新构建docker镜像。
通过以上步骤,您应该能够成功地在Docker中运行python manage.py migrate命令。