今天,我尝试修改一个完整的应用程序(前端、API和数据库),这样我就可以将它部署到本地机器或/和虚拟机上。
在做时:
docker-compose up当我尝试用以下env变量启动我的API时,我得到了一个"Connect ECONNREFUSED“,该API将连接到数据库(它在引擎盖下使用Sequelize ):
DATABASE_URL: "postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-jy95}@db:5432/${POSTGRES_DB:-sourcecode}"在码头医生中,有人说:
每个容器现在可以查找主机名、web或db,并返回相应容器的IP地址。例如,web的应用程序代码可以连接到URL postgres://db:5432,并开始使用Postgres数据库。
在PostgreSQL文档中,我们可以看到postgresql://也是有效的:
The URI scheme designator can be either postgresql:// or postgres://. Each of the URI parts is optional.以下是我的完整docker-compose.yml文件:
version: '3.7'
services:
frontend:
image: jy95/sourcecode-front
restart: always
depends_on:
- api
ports:
- "80:3000"
- "443:3000"
environment:
API_SERVER: "api:8080"
CDN_SERVER: "api:8080/files"
api:
image: jy95/sourcecode_api
restart: always
ports:
- "8080:3000"
depends_on:
- db
environment:
DATABASE_URL: "postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-jy95}@db:5432/${POSTGRES_DB:-sourcecode}"
# use a env file if you want to use other values that default ones
# https://docs.docker.com/compose/environment-variables/#the-env_file-configuration-option
db:
image: postgres:12-alpine
restart: always
ports:
- "5432:5432"
environment:
# use a env file for that part later
# https://docs.docker.com/compose/environment-variables/#the-env_file-configuration-option
POSTGRES_USER: postgres
POSTGRES_PASSWORD: jy95
POSTGRES_DB: sourcecode
POSTGRES_PORT: 5432
# If we want to access more easily to the database (not recommended)
# PGDATA: /var/lib/postgresql/data/pg_data
#volumes:
# - pg_data:/var/lib/postgresql/data/pg_data提前感谢您的帮助
PS:这些图像已经在码头枢纽上了
发布于 2020-02-23 02:10:05
您的评论实际上是一个很大的线索:“这是我使用的命令(正如我所看到的,我使用了"depends_on”来确保数据库在API之前是必需的)。错误是: SequelizeConnectionRefusedError: connect 127.0.0.1:5432 --我不明白这一点:码头文档不是最新的?“
看来您的api容器正在尝试拍摄本地主机,而不是db:5432 (正如您已经指出的,db是一个DNS名称,它不太可能解析为127.0.0.1 (IP保留给本地主机)。
快速调试:运行: docker -it sh (在容器中) apk添加busybox- ->,然后: telnet 127.0.0.1 5432 ->您将看到这是不可访问的,但是telnet db 5432 ->非常好,而且您可以运行nslookup db ->,因为我们已经建立了这个dns名称(db)应该是可解析的。
我曾尝试将network_mode: host添加到api中(在docker-come.yml中),但这会导致应用程序崩溃。此时,我建议检查api的代码,并查找对127.0.0.1:5432的引用,如果您运行了docker -it sh,然后: printenv,您将看到DB_URL环境变量设置为: postgresql://postgres:jy95@db:5432/sourcecode,但是您确定这个ENV是由api使用的吗?(也许您已经按示例注释了一些代码,并且仍然在使用不同的连接字符串)
https://stackoverflow.com/questions/60357796
复制相似问题