为什么docker-compose构建不能反映我的django代码更改?

时间:2017-01-03 19:46:20

标签: django docker docker-compose

所以我有一个我用Docker-compose部署的Django项目。我的profile_form.html模板中有一个简单的错误,第3行突出显示。

{% include "header.html" %}
{% load i18n %}
{% load url from future %}

'future' is not a registered tag library

所以我简单地删除了加载网址行,保存了profile_form.html,然后尝试构建一个反映代码更改的新容器。

docker-compose build
docker-compose start

这没有解决问题,我得到了同样的错误。我通过运行

进入容器
docker-compose exec -i -t <containerid> /bin/bash

并检查了profile_form.html,确定第3行仍在那里。

除非我遗漏了一些完全明显的东西,否则这告诉我,我对docker-compose构建的理解是不正确的。我认为docker-compose build能够确定“是''''目录中有代码更改”,然后重建容器。

1 个答案:

答案 0 :(得分:11)

您不需要在每次更改代码时重建用于开发的docker镜像。这将花费太多时间。但是因为你正在开发django而且我认为你正在使用随django(python manage.py runserver)附带的开发服务器,你可以直接将新的代码更改发送到容器并让开发服务器热插入代码正如您在本地计算机上开发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

我为代码重新加载标记了重要的一行。此行确保本地计算机上的每个更改也反映在容器内。 dev-server runserver识别本地代码更改并重新启动Web服务器,这只需几秒钟。

这是在docker容器中使用django应用程序的方法。

为什么运行docker-compose start后没有变化?

docker-compose start使用代码中的错误行启动旧图像的旧容器。您需要使用新图像创建新容器。对于这种情况,命令是docker-compose up。来自docker-compose start的{​​{3}}:

  

用法:启动[SERVICE ...]
  启动服务的现有容器。

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