簡體   English   中英

Docker Compose 無法連接數據庫

[英]Docker Compose cannot connect to database

我在后端使用nestjs,並使用typeorm 作為ORM。 我試圖在 docker-compose 文件中定義我的數據庫和我的應用程序。

如果我將數據庫作為容器運行,而我的應用程序從本地計算機運行,它運行良好。 我的程序連接並創建表等。

但是,如果我嘗試從容器內連接數據庫或使用 docker-compose 啟動容器,則會失敗。

總是得到一個 ECONNREFUSED 錯誤。

我的錯誤在哪里?

docker-compose.yml

version: '3.1'
volumes:
 dbdata:

services:
  db:
    image: postgres:10
    volumes:
      - ./dbData/:/var/lib/postgresql/data
    restart: always
    environment:
      - POSTGRES_PASSWORD=${TYPEORM_PASSWORD}
      - POSTGRES_USER=${TYPEORM_USERNAME}
      - POSTGRES_DB=${TYPEORM_DATABASE}
    ports:
      - ${TYPEORM_PORT}:5432

  backend:
    build: .
    ports:
      - "3001:3000"
    command: npm run start
    volumes:
      - .:/src

Dockerfile

FROM node:10.5

WORKDIR /home

# Bundle app source
COPY . /home

# Install app dependencies
#RUN npm install -g nodemon
# If you are building your code for production
# RUN npm install --only=production
RUN npm i -g @nestjs/cli
RUN npm install

EXPOSE 3000

.env

# .env
HOST=localhost
PORT=3000
NODE_ENV=development
LOG_LEVEL=debug

TYPEORM_CONNECTION=postgres
TYPEORM_HOST=localhost
TYPEORM_USERNAME=postgres
TYPEORM_PASSWORD=postgres
TYPEORM_DATABASE=mariokart
TYPEORM_PORT=5432
TYPEORM_SYNCHRONIZE=true
TYPEORM_DROP_SCHEMA=true
TYPEORM_LOGGING=all
TYPEORM_ENTITIES=src/database/entity/*.ts
TYPEORM_MIGRATIONS=src/database/migrations/**/*.ts
TYPEORM_SUBSCRIBERS=src/database/subscribers/**/*.ts

我嘗試使用鏈接,但它在容器中不起作用。

看一下backend容器內的/etc/hosts 你會看見

192.0.18.1    dir_db_1

或類似的東西。 IP將不同,並且dir將代表您所在的目錄。因此,必須將TYPEORM_HOST=localhost更改為TYPEORM_HOST=dir_db_1

雖然,我建議您為容器設置靜態名稱。

services:
  db:
    container_name: project_db
    ...
  backend:
    container_name: project_backend

在這種情況下,您始終可以確定容器將具有靜態名稱,並且可以設置TYPEORM_HOST=project_dbTYPEORM_HOST=project_db再擔心該名稱了。

您可以創建一個網絡並在兩個服務之間共享。

為數據庫和后端服務創建網絡:

networks:
  common-net: {}

並將網絡添加到這兩個服務中。 所以你的 .yml 文件在編輯后會如下所示:

version: '3.1'
volumes:
 dbdata:

services:
  db:
    image: postgres:10
    volumes:
      - ./dbData/:/var/lib/postgresql/data
    restart: always
    environment:
      - POSTGRES_PASSWORD=${TYPEORM_PASSWORD}
      - POSTGRES_USER=${TYPEORM_USERNAME}
      - POSTGRES_DB=${TYPEORM_DATABASE}
    ports:
      - ${TYPEORM_PORT}:5432
    networks:
      - common-net

  backend:
    build: .
    ports:
      - "3001:3000"
    command: npm run start
    volumes:
      - .:/src
    networks:
      - common-net


networks:
  common-net: {}
注意1:在此更改之后,除非您有理由,否則無需對外公開 Postgres 端口。 您可以刪除該部分。
注意 2:TYPEORM_HOST 應重命名為 db。 Docker會自行解析db服務的IP地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM