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

dav*_*vid 6 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
Run Code Online (Sandbox Code Playgroud)

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

docker-compose build
docker-compose start
Run Code Online (Sandbox Code Playgroud)

这没有解决问题,我得到了同样的错误.我跑进了容器

docker-compose exec -i -t <containerid> /bin/bash
Run Code Online (Sandbox Code Playgroud)

并检查了profile_form.html,确定第3行仍然存在.

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

n2o*_*n2o 16

在每次更改代码时,无需重建用于开发的docker镜像.这将花费太多时间.但是因为你正在开发django而且我认为你正在使用django(python manage.py runserver)附带的dev-server ,你可以直接将你的新代码更改发送到你的容器,并让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/
Run Code Online (Sandbox Code Playgroud)

ADD . /code/最初将您的本地代码复制到容器中.这是您第一次构建映像时应用程序的初始状态.但我们不希望在每次代码更改时构建映像,因为这需要几分钟.您正在使用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
Run Code Online (Sandbox Code Playgroud)

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

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

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

docker-compose start使用代码中的错误行启动旧图像的旧容器.您需要使用新图像创建新容器.对于这种情况是命令docker-compose up.从文档docker-compose start:

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

当然,您可以删除旧容器docker-compose rm.这只会删除您的容器,而不是图像.