无法在 Docker 容器中启动 Django 服务器 - 类型错误:类型 'NoneType' 的参数不可迭代



所以我使用VSCode的远程容器扩展在Docker中创建了一个dev-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实例中。如果我不能成功,我安装了诗本身作为一个故障安全。

在安装依赖项(使用'pip3 install'和'poetry install')之后,然后尝试运行"python3 manage.py runserver"或者"诗歌运行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不在我实例化的容器中,也不在docker-compose文件中设置的env变量中,如上所示。所以那条路线显示为& None"或"NoneType".

修改后,Django服务器启动成功。

相关内容

最新更新