因此,我有一个正在使用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 startdocs中:



可以肯定的是,您可以使用docker-compose rm删除旧容器。这只会删除您的容器,而不会删除图像。

09-11 23:43