如何使Docker构建运行python manage.py migrate。

31 浏览
0 Comments

如何使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的清晰文档。

0
0 Comments

问题的原因是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。

0
0 Comments

问题出现的原因是在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命令。

0