我几乎只使用 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 实际上绑定到您的本地目录,它会将它们保存到您的本地计算机。