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

所以我有一个我用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,然后尝试构build一个反映代码更改的新容器。

 docker-compose build docker-compose start 

这并没有解决这个问题,我得到了同样的错误。 我跑进了集装箱

 docker-compose exec -i -t <containerid> /bin/bash 

并检查了profile_form.html,确保足够的第3行仍然存在。

除非我错过了一些完全明显的东西,这告诉我,我对docker-compose构build的理解是不正确的。 正如我以为docker-compose构build将能够确定“是”在“web”目录中有一个代码更改“,然后重build容器。

您不需要重新编译用于开发的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/ ADD . /code/最初将您的本地代码复制到容器中。 这是您第一次构build映像时应用程序的初始状态。 但是我们不想在每个代码更改上构build图像,因为这需要几分钟的时间。 您正在使用docker-compose,并且可以将卷映射到您的容器,以便重新加载热代码,正如Docker开发人员在教程中所看到的:

 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 

我标记了代码重新加载的重要行。 这一行确保您的本地机器上的每个更改都反映在容器内。 开发服务器runserver识别本地代码更改并重新启动Web服务器,只需要几秒钟。

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

为什么在运行docker-compose start之后没有任何更改?

docker-compose start在你的代码中用错误的行开始旧图像的旧容器。 您需要使用新图像创build新的容器。 对于这种情况是命令docker-compose up 。 从docker-compose start的文档 :

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

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