Nestjs Typeorm + Postgres Docker Compose 似乎不起作用
Nestjs Typeorm + Postgres Docker Compose doesn't seem to work
我有一个带有活动 PostgreSQL 连接的 Nestjs API + TypeORM。我目前正在尝试 docker 化整个 api。
Docker 文件:
ENV DIR=/home/node/app
RUN mkdir -p ${DIR}
WORKDIR ${DIR}
COPY package*.json ./
RUN npm install
RUN npm install -g @nestjs/cli
RUN npm run build
COPY . .
EXPOSE 3000
CMD ["node", "dist/main.js"]
Typeorm 配置:
require('dotenv').config()
@Module({
imports: [
TypeOrmModule.forRoot({
type: "postgres",
host: process.env.DB_HOST,
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
port: 5432,
database: "postgres",
entities: ["dist/**/*.entity{.ts,.js}"],
synchronize: false }),
.env 文件:
DB_HOST=postgres
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=test
docker-compose.yaml 文件:
version: "3.9"
services:
middleware:
build: .
container_name: "middleware"
ports:
- "3000:3000"
depends_on:
- postgres
env_file:
- .env
postgres:
image: "postgres:12"
restart: always
container_name: "postgres"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=postgres
ports:
- "5433:5432"
volumes:
- api:/var/lib/postgresql/data
- ./src/migs/001_create.sql:/docker-entrypoint-initdb.d/001_create.sql
volumes:
api:
我还有一个 .sql 文件,它创建了第一个表并用数据填充它们,但我想这与我的问题无关。据我所知,问题似乎出在 .env 文件上,但我不明白我做错了什么?我正在访问 postgres 主机,它也是 运行 容器的名称,我不认为问题出在这里。
我可以通过以下方式从外部访问 postgres 容器
winpty docker exec -it postgres psql -U postgres -h postgres postgres
表格创建成功,必须是.env文件。
api 的控制台输出是:
Unable to connect to the database. Retrying (8)...
error: no PostgreSQL user name specified in startup packet
欢迎任何帮助!提前致谢!
PS: 我在 Whosebug 中找到了类似的主题,但似乎没有解决我的问题。如果我有任何机会错过了一个已经回答的主题,请指出它。
将 postgres 的所有环境变量放入 .env 文件
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=postgres
然后告诉 docker-compose 使用 postgres 容器的 .env 文件解决了问题。
我有一个带有活动 PostgreSQL 连接的 Nestjs API + TypeORM。我目前正在尝试 docker 化整个 api。
Docker 文件:
ENV DIR=/home/node/app
RUN mkdir -p ${DIR}
WORKDIR ${DIR}
COPY package*.json ./
RUN npm install
RUN npm install -g @nestjs/cli
RUN npm run build
COPY . .
EXPOSE 3000
CMD ["node", "dist/main.js"]
Typeorm 配置:
require('dotenv').config()
@Module({
imports: [
TypeOrmModule.forRoot({
type: "postgres",
host: process.env.DB_HOST,
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
port: 5432,
database: "postgres",
entities: ["dist/**/*.entity{.ts,.js}"],
synchronize: false }),
.env 文件:
DB_HOST=postgres
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=test
docker-compose.yaml 文件:
version: "3.9"
services:
middleware:
build: .
container_name: "middleware"
ports:
- "3000:3000"
depends_on:
- postgres
env_file:
- .env
postgres:
image: "postgres:12"
restart: always
container_name: "postgres"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=postgres
ports:
- "5433:5432"
volumes:
- api:/var/lib/postgresql/data
- ./src/migs/001_create.sql:/docker-entrypoint-initdb.d/001_create.sql
volumes:
api:
我还有一个 .sql 文件,它创建了第一个表并用数据填充它们,但我想这与我的问题无关。据我所知,问题似乎出在 .env 文件上,但我不明白我做错了什么?我正在访问 postgres 主机,它也是 运行 容器的名称,我不认为问题出在这里。
我可以通过以下方式从外部访问 postgres 容器
winpty docker exec -it postgres psql -U postgres -h postgres postgres
表格创建成功,必须是.env文件。 api 的控制台输出是:
Unable to connect to the database. Retrying (8)...
error: no PostgreSQL user name specified in startup packet
欢迎任何帮助!提前致谢! PS: 我在 Whosebug 中找到了类似的主题,但似乎没有解决我的问题。如果我有任何机会错过了一个已经回答的主题,请指出它。
将 postgres 的所有环境变量放入 .env 文件
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=postgres
然后告诉 docker-compose 使用 postgres 容器的 .env 文件解决了问题。