我在使用nodejs和docker连接到postgres时遇到问题。它给我以下错误:
Error: getaddrinfo ENOTFOUND db db:5432
这是我的docker compose文件:
version: '3.5'
services:
api:
build:
dockerfile: Dockerfile.dev
context: ./
depends_on:
- db
ports:
- '${NODE_PORT}:${NODE_PORT}'
environment:
DB_HOST: ${DB_HOST}
DB_PORT: ${DB_PORT}
DB_USERNAME: ${DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD}
DB_DATABASE: ${DB_DATABASE}
NODE_HOST: ${NODE_HOST}
NODE_PORT: ${NODE_PORT}
volumes:
- ./src:/usr/src/app/src
db:
image: postgres:11
build:
dockerfile: Dockerfile.dev
context: ./database
container_name: pgsql
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE}
volumes:
- ./database/schema/base.sql:/docker-entrypoint-initdb.d/0.schema.sql
- ./database/schema/tables.sql:/docker-entrypoint-initdb.d/1.tables.sql
- ./database/schema/grant.sql:/docker-entrypoint-initdb.d/2.grant.sql
- ./database/fixtures/basics.sql:/docker-entrypoint-initdb.d/3.basics.sql
- ./database/fixtures/relations.sql:/docker-entrypoint-initdb.d/4.relations.sql
ports:
- '${DB_PORT}:5432'
networks:
- postgres
restart: unless-stopped
networks:
postgres:
driver: bridge
我使用以下环境变量进行调用:
DB_USERNAME=postgres
DB_PASSWORD=postgres
DB_DATABASE=prpp
DB_HOST=db
DB_PORT=5432
NODE_PORT=3003
NODE_HOST=0.0.0.0
NODE_ENV=dev
尝试与TypeOrm建立连接时出现以下错误:
public async init(): Promise<void> {
console.log('init', this.app.locals);
try {
this.connection = await createConnection({
type: 'postgres',
host: this.app.locals.DB_HOST,
port: this.app.locals.DB_PORT,
username: this.app.locals.DB_USERNAME,
password: this.app.locals.DB_PASSWORD,
database: this.app.locals.DB_DATABASE,
entities: [resolve(__dirname, '..', 'api/**/*.model.{ts,js}')],
logging: false,
});
} catch (err) {
console.error(err);
}
}
这是我从容器中得到的输出:
api_1 | init { PORT: 3003,
api_1 | DB_USERNAME: 'postgres',
api_1 | DB_PASSWORD: 'postgres',
api_1 | DB_DATABASE: 'prpp',
api_1 | DB_HOST: 'db',
api_1 | DB_PORT: 5432,
api_1 | env: 'dev' }
api_1 | Here 3003 dev
api_1 | Server starting on 3003
api_1 | { Error: getaddrinfo ENOTFOUND db db:5432
api_1 | at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:58:26)
api_1 | errno: 'ENOTFOUND',
api_1 | code: 'ENOTFOUND',
api_1 | syscall: 'getaddrinfo',
api_1 | hostname: 'db',
api_1 | host: 'db',
api_1 | port: 5432 }
但是如果我从
替换主机this.connection = await createConnection({
type: 'postgres',
host: this.app.locals.DB_HOST,
至:
this.connection = await createConnection({
type: 'postgres',
host: 'host.docker.internal',
port: this.app.locals.DB_PORT
它完美地工作。我想了解我的配置缺少什么
答案 0 :(得分:0)
好吧,我知道了,我在docker-compose中缺少网络部分:
services:
api:
...
networks:
- postgres