在docker down / docker up之后,debug_toolbar模块不持久

问题描述

我使用Django启动了一个新项目。这个项目是使用Docker构建的,几乎没有容器和诗歌来安装所有依赖项。

当我第一次运行docker-compose up -d时,一切都已正确安装。实际上,这个问题与我想的Docker无关。

运行该命令后,我正在运行docker-compose exec python make -f automation/local/Makefile,其中包含以下内容

制作文件

.PHONY: all
all: install-deps run-migrations build-static-files create-superuser

.PHONY: build-static-files
build-static-files:
    python manage.py collectstatic --noinput

.PHONY: create-superuser
create-superuser:
    python manage.py createsuperuser --noinput --user=${DJANGO_SUPERUSER_USERNAME} --email=${DJANGO_SUPERUSER_USERNAME}@zitec.com

.PHONY: install-deps
install-deps: vendor

vendor: pyproject.toml $(wildcard poetry.lock)
    poetry install --no-interaction --no-root

.PHONY: run-migrations
run-migrations:
    python manage.py migrate --noinput

pyproject.toml

[tool.poetry]
name = "some-random-application-name"
version = "0.1.0"
description = ""
authors = ["xxx <[email protected]>"]

[tool.poetry.dependencies]
python = ">=3.6"
Django = "3.0.8"
docusign-esign = "^3.4.0"

[tool.poetry.dev-dependencies]
pytest = "^3.4"
django-debug-toolbar = "^2.2"

通过在settings.py(MIDDLEWARE / INSTALLED_APP)甚至是DEBUG_TOOLBAR_​​CONfig添加以下条目来安装调试工具栏,其下一个值为SHOW_TOOLBAR_CALLBACK

让我确认新鲜的docker-compose up -d之后一切正常。在我停止容器并使用下一个命令再次启动它之后,会发生问题:

  • docker-compose down
  • docker-compose up -d

当我尝试访问该项目时,它说Module debug_toolbar does not exist!

我阅读了该网站上的所有问题,但对我没有任何帮助。

以前有人遇到过这个问题吗?

解决方法

这听起来像是正常行为。容器具有一个临时文件系统,当容器退出时,对该文件系统进行的任何更改都将永久丢失。删除和重新创建容器是非常常规的操作(即使仅更改environment:文件中的ports:docker-compose.yml设置也会导致这种情况发生。)

几乎永远不要在正在运行的容器中安装软件。 docker exec是一个非常有用的调试工具,但它不应该是与容器交互的主要方式。在这两种情况下,如果您需要更改Docker级别的设置或更新基础映像,都将自己设置为失去工作。

在此示例中,您可以将Makefile的内容分为两部分,install_deps目标(安装Python软件包,但没有任何外部依赖项),其余部分(取决于数据库)正在运行)。您需要在映像构建时运行安装部分,但是Dockerfile无法访问数据库,因此其余部分需要在容器启动时进行。

因此,在映像的DockerfileRUN安装部分中:

RUN make install-reps

您还将需要一个入口点脚本,该脚本将执行其余的首次设置,然后运行main container命令。看起来像:

#!/bin/sh
make run-migrations build-static-files create-superuser
exec "$@"

然后在您的Dockerfile中运行它:

COPY entrypoint.sh .
ENTRYPOINT ["./entrypoint.sh"]
CMD python3 manage.py runserver --host 0.0.0.0

(最近我见过很多只有ENTRYPOINT ["python3"]的Dockerfile。以这种方式拆分ENTRYPOINTCMD并不是特别有用;只需移动python3解释器命令放入CMD。)