用Docker开发Django

问题描述 投票:1回答:1

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

  1. 我创建了一个使用Django dev服务器和db的Dockerfile,这样好吗?或者我应该使用具有专用Web和数据库服务器的单独容器?
  2. 我应该如何创建新的迁移?假设我正在使用-v将代码安装到容器中,对模型的更改需要创建新的迁移,因此,我应该使安装可写并使用容器内的创建迁移吗?还有哪些其他选择?
  3. 我正在考虑向RUN添加Dockerfile指令,该指令将应用迁移以便在迁移未更改时使用缓存。这是一个好习惯吗?
django docker development-environment
1个回答
3
投票

我几乎只使用Docker来开发python(Flask dev)。除非你使用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

这是我在进行Flask开发时使用的。

编辑金达意识到这并没有回答你的所有问题

我总是做多容器,所以如果我愿意,我可以换掉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命令基本上被重写为compose文件(因为docker-compose只调用底层的api)。您实际上可以通过docker CLI在后台启动postgress容器,而不是使用compose,但compose使得使用多个容器变得更加容易。由于没有明确定义的网络,容器只是创建一个默认网络并绑定到它。数据库容器的主机名是db或您决定调用该服务的任何内容。因此,在您的python文件中,您需要将其用作连接中的主机名。

对于迁移,我认为您应该只在Web容器中执行它们。我没有真正做过任何Django dev,但如果它与Flask迁移类似,我会认为是这种情况。

$ 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实际上绑定到本地目录,它将它们保存到本地计算机。

© www.soinside.com 2019 - 2024. All rights reserved.