问题描述
我使用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
无法访问数据库,因此其余部分需要在容器启动时进行。
因此,在映像的Dockerfile
,RUN
安装部分中:
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。以这种方式拆分ENTRYPOINT
和CMD
并不是特别有用;只需移动python3
解释器命令放入CMD
。)