我正在尝试使用Docker为Django Web应用程序创建自己的开发环境
我的问题是我应该如何设置它以进行开发?
Dockerfile
,这样好吗?或者我应该使用具有专用Web和数据库服务器的单独容器吗?-v
将代码安装到容器中,对模型的更改需要创建新的迁移,因此,我应该使安装可写并使用容器内的创建迁移吗?还有哪些其他选择?RUN
添加Dockerfile
指令,该指令将应用迁移,以便在迁移未发生变化时使用缓存。这是一个好习惯吗?答案 0 :(得分: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开发,但如果它与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
实际上绑定到本地目录,它会将它们保存到本地计算机。