与Docker一起开发Django



我正在尝试使用Docker创建Django Web应用程序的开发环境。
我的问题是我应该如何设置开发?

  1. 我创建了一个使用Django Dev Server和DB的Dockerfile,这很好吗?还是我应该使用专用的Web和DB服务器使用单独的容器?
  2. 我应该如何创建新的迁移?假设我使用-v将代码安装到容器中,模型的更改需要创建新的迁移,因此,我是否应该制作安装式迁移并使用来自容器内部的创建迁移?还有哪些其他选项?
  3. 我正在考虑将RUN指令添加到Dockerfile中,该指令将应用迁移以在迁移时使用缓存。这是一个好习惯吗?

我几乎只使用docker再用python(烧瓶开发)。除非您使用Pycharm,否则Virtualenvs很烦人。

FROM python:3.6
# Install requirements
RUN pip install django==VERSION 
    package==version
ADD . /code
WORKDIR /code
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

和运行

$ docker build -t IMAGE_NAME .
$ docker run -it 
    -p 8000:8000 
    --mount src=$(pwd),target=/code,type=bind 
    -e DEBUG=1 
    IMAGE_NAME

让主机为0.0.0.0很重要,因为localhost在容器主机文件中不存在。--mount-e DEBUG=1的组合将使您能够利用更改的热加载。您可能需要更改 manage.py,例如这样

DEBUG = os.getenv('DEBUG') or 0

这是我在做烧瓶开发时使用的。

edit 有点意识到这不会回答您的所有问题

我总是做多个容器,以便我可以换掉DB后端,如果我这样。

version: '3'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DEBUG=1
    volumes:
      - type: bind
        source: .
        target: /code
  db: # This is the host name
    image: postgress:10.1
    environment:
      - POSTGRESS_USER=USERNAME
      - POSTGRESS_PASSWORD=PASS
      - POSTGRESS_DB=DBNAME
    volumes:
      - data:/var/lib/postgresql/data
volumes:
  data:

您需要在此示例中声明命名卷data,您可以通过...

查看其存储的位置
$ docker volumes inspect data

我前面说的docker run命令基本上已重写为撰写文件(因为Docker-Compose只是调用基础API)。您可以通过Docker CLI实际上在后台启动了"盖后容器",而不是使用Compose,但Compose可以使使用多个容器更容易工作。由于没有明确定义的网络,因此容器只是创建一个默认网络并绑定到它。数据库容器的主机名是db或您决定调用服务的任何内容。因此,在您的Python文件中,您需要将其用作连接中的主机名。

就迁移而言,我认为您应该在Web容器中执行它们。我并没有真正完成任何Django Dev,但是如果它与烧瓶迁移相似,我会认为是这种情况。

$ docker exec -it web_container_name/hash /bin/bash
root@web_container_hash# python manage.py makemigrations
root@web_container_hash# python manage.py migrate

编辑2

当这些命令运行时,它应该创建您的迁移,并且由于/code实际上已绑定到您的本地目录,因此将它们保存到您的本地计算机。

最新更新