因此,我有一个正在使用docker-compose进行部署的Django项目。我的profile_form.html模板中有一个简单的错误,突出显示了第3行。
{% include "header.html" %}
{% load i18n %}
{% load url from future %}
'future' is not a registered tag library
因此,我简单地删除了加载URL行,保存了profile_form.html,然后尝试构建一个反射(reflect)代码更改的新容器。
docker-compose build
docker-compose start
这不能解决问题,并且出现相同的错误。我运行跑进了容器
docker-compose exec -i -t <containerid> /bin/bash
并检查了profile_form.html并确保仍有足够的第3行。
除非我丢失了一些显而易见的东西,否则这表明我对docker-compose构建的理解是错误的。正如我认为的docker-compose build能够确定“是的,'web'目录中存在代码更改”,然后重新构建容器。
最佳答案
您无需在每次代码更改时重建用于开发的docker镜像。这将花费太多时间。但是由于您正在开发django,并且我假设您使用的是django附带的dev-server(python manage.py runserver
),因此您可以将新的代码更改直接发送到容器中,并让dev-server在使用时热加载代码在本地计算机上开发django应用程序时遇到的问题。您需要将一个卷从主机映射到您的容器,该容器将接收最新代码并使用它来更新您的应用程序。
由于您未提供任何代码示例,因此我只能猜测您在做什么。看一下由docker开发人员直接提供的示例:https://docs.docker.com/compose/django/
他们的Dockerfile:
FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
ADD . /code/
最初会将您的本地代码复制到容器中。这是您首次构建镜像时应用程序的初始状态。但是我们不希望在每次代码更改时都建立镜像,因为这需要花费几分钟。您正在使用docker-compose,并且可以将卷映射到您的容器以进行热代码重载,如docker devs在本教程中所见:version: '2'
services:
db:
image: postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code # <-- THIS line enables hot code reloading!
ports:
- "8000:8000"
depends_on:
- db
我标记了代码重新加载的重要行。此行确保本地计算机上的每个更改也都反射(reflect)在容器内。开发服务器
runserver
识别本地代码更改并重新启动Web服务器,这仅需几秒钟。这是在Docker容器中使用django应用程序的方式。
为什么在运行docker-compose start之后没有任何更改?
docker-compose start
用代码中的错误行启动旧图像的旧容器。您需要使用新镜像创建新容器。在这种情况下,请使用docker-compose up
命令。从docker-compose start
的docs中:可以肯定的是,您可以使用
docker-compose rm
删除旧容器。这只会删除您的容器,而不会删除图像。