Невозможно запустить сервер Django в контейнере Docker - TypeError: аргумент типа 'NoneType' не является итерируемым
Итак, я создал dev-контейнер в Docker, используя расширение VSCode Remote - Container. Конфиг выглядит следующим образом:
файл devcontainer.json:
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: // https://github.com/microsoft/vscode-dev-containers/tree/v0.238.0/containers/python-3-postgres // Update the VARIANT arg in docker-compose.yml to pick a Python version { "name": "Python 3 & PostgreSQL", "dockerComposeFile": "docker-compose.yml", "service": "app", "workspaceFolder": "/workspace", // Configure tool-specific properties. "customizations": { // Configure properties specific to VS Code. "vscode": { // Set *default* container specific settings.json values on container create. "settings": { "python.defaultInterpreterPath": "/usr/local/bin/python", "python.linting.enabled": true, "python.linting.pylintEnabled": true, "python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8", "python.formatting.blackPath": "/usr/local/py-utils/bin/black", "python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf", "python.linting.banditPath": "/usr/local/py-utils/bin/bandit", "python.linting.flake8Path": "/usr/local/py-utils/bin/flake8", "python.linting.mypyPath": "/usr/local/py-utils/bin/mypy", "python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle", "python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle", "python.linting.pylintPath": "/usr/local/py-utils/bin/pylint", "python.testing.pytestPath": "/usr/local/py-utils/bin/pytest" }, // Add the IDs of extensions you want installed when the container is created. "extensions": [ "ms-python.python", "ms-python.vscode-pylance" ] } }, // Use 'forwardPorts' to make a list of ports inside the container available locally. // This can be used to network with other containers or the host. "forwardPorts": [5000, 5432, 8000], // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": "pip install --user poetry" // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. // "remoteUser": "vscode" }
файл docker-compose.yml:
> version: '3.8'
>
> services: app:
> build:
> context: ..
> dockerfile: .devcontainer/Dockerfile
> args:
> # Update 'VARIANT' to pick a version of Python: 3, 3.10, 3.9, 3.8, 3.7, 3.6
> # Append -bullseye or -buster to pin to an OS version.
> # Use -bullseye variants on local arm64/Apple Silicon.
> VARIANT: 3.9-bullseye
> # Optional Node.js version to install
> NODE_VERSION: "lts/*"
>
> volumes:
> - ..:/workspace:cached
>
> # Overrides default command so things don't shut down after the process ends.
> command: sleep infinity
>
> # Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function.
> network_mode: service:db
> # Uncomment the next line to use a non-root user for all processes.
> # user: vscode
>
> # Use "forwardPorts" in **devcontainer.json** to forward an app port locally.
> # (Adding the "ports" property to this file will not forward from a Codespace.)
>
> db:
> image: postgres:latest
> restart: unless-stopped
> volumes:
> - postgres-data:/var/lib/postgresql/data
> environment:
> POSTGRES_USER: postgres
> POSTGRES_DB: postgres
> POSTGRES_PASSWORD: postgres
> # Add "forwardPorts": ["5432"] to **devcontainer.json** to forward PostgreSQL locally.
> # (Adding the "ports" property to this file will not forward from a Codespace.)
>
> volumes: postgres-data: null
Dockerfile
> # [Choice] Python version (use -bullseye variants on local arm64/Apple Silicon): 3, 3.10, 3.9, 3.8, 3.7, 3.6, 3-bullseye, 3.10-bullseye,
> 3.9-bullseye, 3.8-bullseye, 3.7-bullseye, 3.6-bullseye, 3-buster, 3.10-buster, 3.9-buster, 3.8-buster, 3.7-buster, 3.6-buster ARG VARIANT=3-bullseye FROM
> mcr.microsoft.com/vscode/devcontainers/python:0-${VARIANT}
>
> ENV PYTHONUNBUFFERED 1
>
> # [Choice] Node.js version: none, lts/*, 16, 14, 12, 10 ARG NODE_VERSION="none" RUN if [ "${NODE_VERSION}" != "none" ]; then su
> vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install
> ${NODE_VERSION} 2>&1"; fi
>
> # [Optional] If your requirements rarely change, uncomment this section to add them to the image.
> # COPY requirements.txt /tmp/pip-tmp/
> # RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt \
> # && rm -rf /tmp/pip-tmp
>
> # [Optional] Uncomment this section to install additional OS packages.
> # RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
> # && apt-get -y install --no-install-recommends <your-package-list-here>
Я решил установить зависимости вручную, так как они перечислены в экземпляре Poetry. На случай, если это не удастся, я установил сам Poetry в качестве запасного варианта.
После установки зависимостей (используя как 'pip3 install', так и 'poetry install') и попытки запустить "python3 manage.py runserver" ИЛИ "poetry run python3 manage.py runserver", я получаю следующую ошибку:
Exception in thread django-main-thread:
Traceback (most recent call last):
File "/usr/local/lib/python3.9/threading.py", line 973, in _bootstrap_inner
self.run()
File "/usr/local/lib/python3.9/threading.py", line 910, in run
self._target(*self._args, **self._kwargs)
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/utils/autoreload.py", line 64, in wrapper
fn(*args, **kwargs)
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/core/management/commands/runserver.py", line 118, in inner_run
self.check(display_num_errors=True)
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/core/management/base.py", line 419, in check
all_issues = checks.run_checks(
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/core/checks/registry.py", line 76, in run_checks
new_errors = check(app_configs=app_configs, databases=databases)
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/core/checks/urls.py", line 13, in check_url_config
return check_resolver(resolver)
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/core/checks/urls.py", line 23, in check_resolver
return check_method()
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/urls/resolvers.py", line 417, in check
messages.extend(check_resolver(pattern))
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/core/checks/urls.py", line 23, in check_resolver
return check_method()
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/urls/resolvers.py", line 419, in check
return messages or self.pattern.check()
File "/root/.cache/pypoetry/virtualenvs/backend-xS3fZVNL-py3.9/lib/python3.9/site-packages/django/urls/resolvers.py", line 282, in check
if '(?P<' in route or route.startswith('^') or route.endswith('$'):
TypeError: argument of type 'NoneType' is not iterable
Машиной, на которой я работаю, является Macbook Air 2020, на которой запущен экземпляр Docker, в котором находится это приложение.
Я нашел решение своей проблемы:
В моем файле urls.py, у меня были настройки url администратора как
path(os.getenv('ADMIN_URL') , admin.site.urls)
Но мой .env не был внутри контейнера, который я создал, как и переменные env, установленные в файле docker-compose, как показано выше. Поэтому маршрут отображался как "None" или "NoneType".
После того, как я исправил это, сервер Django успешно запустился.