【问题标题】:Developing Django with Docker使用 Docker 开发 Django
【发布时间】:2018-06-01 04:00:07
【问题描述】:

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

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

【问题讨论】:

  • 我不会在容器内开发。只需在推送新提交之前在内部运行测试。使用 runserver 在 vi​​rtualenv 中本地开发 django 轻而易举。
  • 只是一个提示 - 尝试使用 docker-compose 并将 web 容器与 db 容器分开。
  • @jcfollower 你能详细说明一下吗?为什么要使用不同的容器?
  • 容器的想法是让一个应用程序或进程在每个容器中运行。见,devops.stackexchange.com/questions/447/…
  • @jcfollower 当然,但这是一个单一的过程。 manage.py runserver

标签: django docker development-environment


【解决方案1】:

我几乎只使用 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开发时使用的。

编辑有点意识到这并不能回答你所有的问题

我总是使用多容器,所以如果我愿意的话,我可以换掉数据库后端。

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 开发,但如果它类似于 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 实际上绑定到您的本地目录,它会将它们保存到您的本地计算机。

【讨论】:

  • 感谢您的回答。在 Django 中进行迁移会创建迁移文件。我应该让容器创建迁移文件吗?卷应该是只读的吗?
  • 我假设你的意思是让容器创建迁移,你的意思是在容器的上下文中执行迁移命令,所以我用实际的命令和注释更新了我的答案。在第二个问题的上下文中,您指的是哪一卷(命名或绑定)?
猜你喜欢
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 2021-02-07
  • 2019-11-03
  • 1970-01-01
  • 2018-02-18
  • 2015-11-08
  • 2017-12-08
相关资源
最近更新 更多