NestJS .env 未连接到 Docker 容器数据库

NestJS .env not connecting to Docker Container DB

我目前在一个 nestjs 项目上工作,我正在尝试将它连接到 mysql/mariadb 数据库,现在是 运行 在 docker 容器中(以及项目本身)。

按照 nestjs“配置”的文档,我通过 cli 安装了包并将其导入 app.module.ts

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { AuthModule } from './auth/auth.module';
import { User } from './auth/user.entity';
import { MoviesModule } from './movies/movies.module';

@Module({
  imports: [
    ConfigModule.forRoot({ //<- imported the config module
      isGlobal: true,
    }),
    TypeOrmModule.forRoot({
      type: 'mariadb',
      host: process.env.DB_HOST, //<- now trying to use the .env files data 
      port: parseInt(process.env.DB_PORT),
      username: process.env.DB_USER,
      password: process.env.DB_PASS,
      database: process.env.DB_NAME,
      entities: [User],
      synchronize: true,
    }),
    AuthModule,
    MoviesModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

我的 .env 看起来像这样

DB_USER=root
DB_PASS=example
DB_HOST=mariadb
DB_NAME=lizenzdb
DB_PORT=3306

我通过 docker-compose 启动了 docker 容器,我的 docker-compose 看起来像这样:

version: '3.5'

services:
  etk-be:
    build: ./backend/
    image: etk-lizenzdb-backend:final
    container_name: etk-be
    restart: unless-stopped
    ports:
      - 3000:3000
    networks: 
      - etk

  mariadb:
    image: mariadb
    container_name: mariadb
    command: --default-authentication-plugin=mysql_native_password
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: lizenzdb
    ports:
      - 3306:3306
    volumes:
      - ./data/db:/var/lib/mysql
    networks:
      - etk

  adminer:
    image: adminer
    container_name: adminer
    restart: unless-stopped
    ports:
      - 8080:8080
    networks:
      - etk

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    restart: unless-stopped
    ports:
      - 8081:80
    environment:
      - PMA_HOST=mariadb
      - PMA_USER=root
      - PMA_PASSWORD=example
    networks:
      - etk

networks:
    etk:
        driver: bridge

我已经尝试在 docker 容器之外连接项目和数据库,并且成功了。我需要为 docker 容器更改的是数据库主机从本地主机到 docker 容器本身的名称 (mariadb),但它不会连接到数据库

您有 .env 文件,但是,您需要让 docker 知道才能使用它。 我正在添加一个示例来展示如何使用它。


services:
  etk-be:
    build: ./backend/
    image: etk-lizenzdb-backend:final
    container_name: etk-be
    restart: unless-stopped
    ports:
      - 3000:3000
    networks: 
      - etk
    env_file: 
      - /path/to/envfile

  mariadb:
    ..

env file documentation