Dockerコンテナ同士でPostgresqlの通信+nestjsをコンテナ化する際にprismaでエラーが出まくりだったので、備忘録として記録する。
ステップ
- nestjsをビルド+コンテナ化する(with prisoma)
- docker-composeで同じコンテナ間のpostgresqlの通信を実現する
不完全
prismaのソースコード内のenvを読み取ってくれなかったので、値直書きしてます。いい方法あれば教えてください。
補足
DB接続文字列は、compseで作成したサービス名で接続可能 ビルド前に知りたかったのでここに紹介
例。。。”postgresql://***:***@service_postgres:5432/***?schema=public”
nestjsをビルド+コンテナ化する
以下dockerファイルを作成してdocker-imgを作成する。色々記事はあったものの、prismaと一緒の記事がなかなかなく、色々試した結果以下の設定で動いた。
ポイント
- node:21-slimを使用
- ビルド時npx prisma generateを実行
- 最終アーティファクトに「apt-get install -y openssl」でopensslを導入 (slimだと入ってないみたい)
- ※slimを選ばなくてもOKだが、slim版でないと1つのイメージが1GB越えで。。。
"debian-openssl-1.1.x" to `binaryTargets` in the "schema.prisma" file and run `prisma generate` after saving it:
###################
# DEVELOPMENT
###################
FROM node:21.0.0-slim AS development
WORKDIR /usr/src/app
RUN apt-get update && apt-get -qq install -y --no-install-recommends \
tzdata \
tini \
&& rm -rf /var/lib/apt/lists/*
ENV NODE_ENV development
COPY --chown=node:node package*.json ./
RUN npm ci
COPY --chown=node:node . .
USER node
###################
# PRODUCTION BUILD
###################
FROM node:21 As build
WORKDIR /usr/src/app
ENV NODE_ENV production
COPY --chown=node:node package*.json ./
COPY --chown=node:node --from=development /usr/src/app/node_modules ./node_modules
COPY --chown=node:node . .
RUN npx prisma generate
RUN npm run build
RUN npm ci --omit=dev && npm cache clean --force
USER node
###################
# PRODUCTION
###################
FROM node:21.0.0-slim
WORKDIR /usr/src/app
ENV NODE_ENV production
RUN apt-get update \
&& apt-get install -y openssl
RUN apt-get update && apt-get -qq install -y --no-install-recommends \
tzdata \
tini \
&& rm -rf /var/lib/apt/lists/*
COPY --chown=node:node --from=build /usr/src/app/package.json ./
COPY --chown=node:node --from=build /usr/src/app/node_modules ./node_modules
COPY --chown=node:node --from=build /usr/src/app/dist ./dist
EXPOSE 3000
USER node
ENTRYPOINT ["/usr/bin/tini", "--"]
CMD [ "node", "dist/main.js" ]
docker-composeを作成
version: '3.8'
services:
service_postgres:
image: postgres:16
container_name: container_postgres
environment:
POSTGRES_USER: ***
POSTGRES_PASSWORD: ***
POSTGRES_DB: ***
ports:
- "5433:5432"
volumes:
- volume_postgres:/var/lib/postgresql/data
- ./postgres_service/initdb.d:/docker-entrypoint-initdb.d
service_laboapi:
image: <<your-image-name>>
container_name: ynetlabo-api
ports:
- "7701:3000"
depends_on:
- service_postgres
volumes:
volume_postgres:
name: vpg
👏動いた