如何在VSCode中调试Docker-Compose部署的FastAPI+PostgreSQL项目
VSCode调试Docker-Compose部署的FastAPI项目问题
我想在VSCode中让代码在断点处停止。项目通过Docker-Compose构建,8000端口可正常运行,但调试时遇到问题。以下是我的配置文件及遇到的问题:
docker-compose.yml
version: '3.4' services: murmurside: image: murmurside build: ./murmur_side command: ["sh", "-c", "pip install debugpy -t /tmp && python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 -m uvicorn app.main:app --host 0.0.0.0 --port 8000"] volumes: - ./murmur_side/:/murmur_side/ ports: - 8000:8000 - 5678:5678 environment: - DATABASE_URL=postgresql://USERNAME:PASSWORD@db/fastapi_db_2 db: image: postgres:13-alpine volumes: - postgres_data2:/var/lib/postgresql/data/ expose: - 5432 environment: - POSTGRES_USER=USERNAME - POSTGRES_PASSWORD=PASSWORD - POSTGRES_DB=fastapi_db_2 volumes: postgres_data2:
Dockerfile
# For more information, please refer to https://aka.ms/vscode-docker-python FROM python:3.10-slim EXPOSE 8000 WORKDIR /murmur_side # Keeps Python from generating .pyc files in the container ENV PYTHONDONTWRITEBYTECODE=1 # Turns off buffering for easier container logging ENV PYTHONUNBUFFERED=1 # Install pip requirements COPY requirements.txt . RUN python -m pip install -r requirements.txt COPY . /murmur_side # Creates a non-root user with an explicit UID and adds permission to access the /app folder # For more info, please refer to https://aka.ms/vscode-docker-python-configure-containers RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /murmur_side USER appuser # During debugging, this entry point will be overridden. For more information, please refer to https://aka.ms/vscode-docker-python-debug CMD ["gunicorn", "--bind", "0.0.0.0:8000", "-k", "uvicorn.workers.UvicornWorker", "app.main:app"]
launch.json调试问题
测试launch配置时,调试器在数据库相关代码处报错:执行DATABASE_URL = os.getenv("DATABASE_URL")后,DATABASE_URL为空值。配置如下:
{ "configurations": [ { "name": "Docker: Python - Fastapi", "type": "docker", "request": "launch", "preLaunchTask": "docker-run: debug", "python": { "pathMappings": [ { "localRoot": "${workspaceFolder}", "remoteRoot": "/app" } ], "projectType": "fastapi" } } ] }
测试attach配置时,会启动一个随机端口的调试器容器,但访问127.0.0.1:随机端口无响应。配置如下:
{ "configurations": [ { "name": "Python: Remote Attach", "type": "python", "request": "attach", "connect": { "host": "0.0.0.0", "port": 8000 # 我也尝试过用5678 }, "preLaunchTask": "docker-run: debug", "pathMappings": [ { "localRoot": "${workspaceFolder}", "remoteRoot": "/murmur_side" } ] } ] }
tasks.json尝试调整
我参考其他项目的做法,在tasks.json中添加了数据库凭证,但除用户名、密码和数据库名外,其他配置项不确定是否正确——毕竟docker-compose中无需设置这些;另外端口设置可能也存在错误。配置如下:
{ "version": "2.0.0", "tasks": [ { "type": "docker-build", "label": "docker-build", "platform": "python", "dockerBuild": { "tag": "sd4timapi_pip_debug:latest", "dockerfile": "${workspaceFolder}/murmur_side/Dockerfile", "context": "${workspaceFolder}/murmur_side/", "pull": true } }, { "type": "docker-run", "label": "docker-run: debug", "dependsOn": [ "docker-build" ], "dockerRun": { # 我也尝试过去掉这个部分 "image": "sd4timapi_pip_debug:latest", "volumes": [ { "containerPath": "/murmur_side/", "localPath": "${workspaceFolder}/murmur_side/" } ], "ports": [ { "containerPort": 8000, "hostPort": 8001, # 因为不允许我用8000:“端口已被占用” "protocol": "tcp" } ], "env": { "APP_PORT": "8000", #不确定 "DEBUG": "TRUE", "ENVIRONMENT": "local", #不确定 "POSTGRES_USER": "USERNAME", "POSTGRES_PASS": "PASSWORD", "POSTGRES_DBNAME": "fastapi_db_2", "POSTGRES_HOST": "db_host", #不确定 "POSTGRES_PORT": "5432", #不确定 "POSTGRES_APPLICATION_NAME": "sd4timapi_pip_debug", #不确定 } }, "python": { "args": [ "app.main:app", "--host", "0.0.0.0", "--port", "8000" ], "module": "uvicorn" } } ] }
内容的提问来源于stack exchange,提问作者PierreL
相关产品推荐
相关产品推荐

