我的django应用正在连接到在docker容器中运行的postgreSQL数据库。
如果我在本地计算机上手动运行该应用程序,则可以毫无问题地连接到该容器:
./src/manage.py runserver
但是,如果我尝试通过VS Code运行调试配置,则会收到此错误:
psycopg2.OperationalError: could not translate host name "db" to address: Name or service not known
尽管db
容器在那里,docker logs db
返回了它的信息
这是我尝试调试时VSCode运行的代码(我没有设置任何这些设置):
/home/me/Developer/myproject/venv/bin/python /home/me/.vscode/extensions/ms-python.python-2019.8.30787/pythonFiles/ptvsd_launcher.py --default --client --host localhost --port 37153 /home/me/Developer/myproject/src/manage.py runserver --noreload
如何使调试配置正常工作?这是VSCode生成的配置:
{
"name": "Python: Django",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/src/manage.py",
"args": [
"runserver",
"--noreload"
],
"django": true
},
编辑:db
容器与docker-compose up db
运行
这是我的 docker-compose.yml (为简单起见,我删除了redis,celery和beat服务)。我仅在docker中运行db
容器,而不在Web服务中运行:
version: '2' # supported by default install on Ubuntu 18.04
services:
db:
image: postgres:9.5-alpine # Production server is using 9.5.17
env_file: .env
volumes:
- postgres_data:/var/lib/postgresql/data/
web:
build: . # current directory
env_file: .env
command: bash -c "python /app/src/manage.py migrate &&
python /app/src/manage.py runserver 0.0.0.0:8000"
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- db
volumes:
postgres_data:
还有一个 docker-compose.override.yml :
version: '2'
services:
db:
ports:
- 5432:5432
.env
POSTGRES_HOST=db
答案 0 :(得分:0)
我认为此版本的docker compose文件不支持您想要的文件。将您的docker版本更改为3.7,如下所示:
version: '3.7'
答案 1 :(得分:0)
好吧,您无法在VS代码中像这样在docker容器中进行调试。为此,您需要从容器内部运行VS代码。为此,您可以按照以下步骤操作:
好吧,如果您有Dockerfile或docker-compose.yml文件,那就太酷了。如果您没有,那也可以。在这种情况下,您可以使用Docker Image构建Docker环境。仅供参考,如果您使用的是基于Alpine的Docker环境,则需要使用VS Code Insiders Edition。
.devcontainer
文件夹在此步骤中,您需要在源目录中创建一个名为.devcontainer的新文件夹。在其中创建一个devcontainer.json
文件。
如果您使用的是docker-compose,则可以使用以下代码:
{
"name": "Python 3",
"context": "..",
"dockerComposeFile": ["../docker-compose.yml"], // You need to point it your `docker-compose.yml` file with proper path.
// Uncomment the next line if you want to publish any ports.
"appPort": 8000,
// Uncomment the next line to run commands after the container is created.
// "postCreateCommand": "python --version",
"service": "web", // You must define which service you are going to use from docker compose.
"workspaceFolder": "/app", // path to your source inside docker file
"extensions": [
// extensions which is going to be installed inside the docker environment
"ms-python.python",
],
"settings": {
// additional settings for VS Code configurations
// You can copy paste them from `settings.json` of your workspace
// Reference: https://code.visualstudio.com/docs/getstarted/settings#_settings-file-locations
"python.pythonPath": "/usr/local/bin/python",
"python.linting.pylintEnabled": true,
"python.linting.enabled": true
}
}
从VS Code Market安装Remote Development扩展包,或使用VS Code的集成市场进行安装:
安装后,VS Code的左下方将显示一个图标:
现在,单击该按钮,将显示如下几个选项:
现在单击“容器”选项中的Remote-Containers: Reopen Folder
,VS代码将重新加载。现在,您位于Docker环境中!
您还可以创建一个调试器,并在源代码中放置断点以查看其是否命中。
可以在official documentation
中找到更多信息,或者也可以检出此blog
。
除非您在docker容器中,否则错误psycopg2.OperationalError: could not translate host name "db" to address: Name or service not known
将无法解决。仍然,如果您打算在本地计算机上进行调试,则可以利用环境变量,如下所示:
DATABASES = {
'default': {
'ENGINE': '...',
'NAME': os.environ.get('db_name'),
'USER': os.environ.get('user'),
'PASSWORD': os.environ.get('password'),
'HOST': os.environ.get('host'),
'PORT': '3306',
},
}
您需要确保您在本地计算机上运行了一个postgresql或公开了数据库docker端口来访问它。