Docker NodeJS 应用程序无法连接到 postgres 数据库
Docker NodeJS app cant connect to postgres database
我对 docker 和 docker-compose 还很陌生。我尝试使用 docker 启动一些服务,其中包含一个 nodejs (Nest.js) api、一个 postgres 数据库和 pgadmin。没有 API (nodejs) 应用程序 dockerized 我可以连接到 docker 数据库容器,但现在我也 dockerized 节点应用程序,它不是连接了,我不知道为什么。我设置的方式有什么问题吗?
这是我的 docker-compose 文件
version: "3"
services:
nftapi:
env_file:
- .env
build:
context: .
ports:
- '5000:5000'
depends_on:
- postgres
volumes:
- .:/app
- /app/node_modules
networks:
- postgres
postgres:
container_name: postgres
image: postgres:latest
ports:
- "5432:5432"
volumes:
- /data/postgres:/data/postgres
env_file:
- docker.env
networks:
- postgres
pgadmin:
links:
- postgres:postgres
container_name: pgadmin
image: dpage/pgadmin4
ports:
- "8080:80"
volumes:
- /data/pgadmin:/root/.pgadmin
env_file:
- docker.env
networks:
- postgres
networks:
postgres:
driver: bridge
这是成功构建的 nodejs 应用程序 Dockerfile,在日志中我看到该应用程序正在尝试连接到数据库,但它不能(没有特定错误)只是找不到数据库。
# Image source
FROM node:14-alpine
# Docker working directory
WORKDIR /app
# Copying file into APP directory of docker
COPY ./package.json /app/
RUN apk update && \
apk add git
# Then install the NPM module
RUN yarn install
# Copy current directory to APP folder
COPY . /app/
EXPOSE 5000
CMD ["npm", "run", "start:dev"]
我的项目根目录中有 2 个 env 文件。
- .env
- docker.env
如上所述,当我从 docker 和 运行 中删除“nftapi”服务时,nodejs 通过简单的 npm 启动启动,它正在连接到 postgres 容器。
TypeOrmModule.forRoot({
type: 'postgres',
host: process.env.POSTGRES_HOST,
port: Number(process.env.POSTGRES_PORT),
username: process.env.POSTGRES_USER,
password: process.env.POSTGRES_PASSWORD,
database: process.env.POSTGRES_DB,
synchronize:true,
entities: ['dist/**/*.entity{.ts,.js}'],
}),
typeorm 模块中使用的 .env 文件中的主机是 localhost
使用 docker-compose 网络时,您应该使用服务名称作为主机名。
所以在你的情况下主机名应该是 postgres
而不是 localhost
您可以在此处阅读更多信息:
https://docs.docker.com/compose/networking/
我对 docker 和 docker-compose 还很陌生。我尝试使用 docker 启动一些服务,其中包含一个 nodejs (Nest.js) api、一个 postgres 数据库和 pgadmin。没有 API (nodejs) 应用程序 dockerized 我可以连接到 docker 数据库容器,但现在我也 dockerized 节点应用程序,它不是连接了,我不知道为什么。我设置的方式有什么问题吗?
这是我的 docker-compose 文件
version: "3"
services:
nftapi:
env_file:
- .env
build:
context: .
ports:
- '5000:5000'
depends_on:
- postgres
volumes:
- .:/app
- /app/node_modules
networks:
- postgres
postgres:
container_name: postgres
image: postgres:latest
ports:
- "5432:5432"
volumes:
- /data/postgres:/data/postgres
env_file:
- docker.env
networks:
- postgres
pgadmin:
links:
- postgres:postgres
container_name: pgadmin
image: dpage/pgadmin4
ports:
- "8080:80"
volumes:
- /data/pgadmin:/root/.pgadmin
env_file:
- docker.env
networks:
- postgres
networks:
postgres:
driver: bridge
这是成功构建的 nodejs 应用程序 Dockerfile,在日志中我看到该应用程序正在尝试连接到数据库,但它不能(没有特定错误)只是找不到数据库。
# Image source
FROM node:14-alpine
# Docker working directory
WORKDIR /app
# Copying file into APP directory of docker
COPY ./package.json /app/
RUN apk update && \
apk add git
# Then install the NPM module
RUN yarn install
# Copy current directory to APP folder
COPY . /app/
EXPOSE 5000
CMD ["npm", "run", "start:dev"]
我的项目根目录中有 2 个 env 文件。
- .env
- docker.env
如上所述,当我从 docker 和 运行 中删除“nftapi”服务时,nodejs 通过简单的 npm 启动启动,它正在连接到 postgres 容器。
TypeOrmModule.forRoot({
type: 'postgres',
host: process.env.POSTGRES_HOST,
port: Number(process.env.POSTGRES_PORT),
username: process.env.POSTGRES_USER,
password: process.env.POSTGRES_PASSWORD,
database: process.env.POSTGRES_DB,
synchronize:true,
entities: ['dist/**/*.entity{.ts,.js}'],
}),
typeorm 模块中使用的 .env 文件中的主机是 localhost
使用 docker-compose 网络时,您应该使用服务名称作为主机名。
所以在你的情况下主机名应该是 postgres
而不是 localhost
您可以在此处阅读更多信息: https://docs.docker.com/compose/networking/