dockerを使ったNode.jsの実行環境を作りました。
実際には、データベースも含みますが、それは省略して、このようなフォルダ構成にしました。
フォルダ構成は、実行環境、開発環境により、様々な方法がありますが、VSCodeでの開発を前提にして、このようにしてみました。
MyApp
├─ .devcontainer
│ ├─ devcontainer.json
│ ├─ docker-compose.yml
│ └─ Dockerfile
├─ src
│ └─
├─ docker-compose.yml
├─ Dockerfile
├─ app.env
└─ .dockerignone
開発環境のdocker(.devcontainerフォルダ内)は、まだ、未完成ですから、ファイル構成のみ、書き残します。
プログラムのソースは、srcフォルダに置くことにしました。
docker-compose.yml
version: '3.8'
services:
app:
build:
context: .
args:
- NODE_ENV=production
container_name: tp_app_container
env_file: ./app.env
environment:
- TZ=Asia/Tokyo
ports:
- '80:3000'
restart: always
working_dir: /app
command: npm start
Dockerfile
FROM node:14-slim
ARG NODE_ENV=production
ENV NODE_ENV $NODE_ENV
ARG PORT=3000
ENV PORT $PORT
EXPOSE $PORT
WORKDIR /app
RUN chown node:node /app
USER node
COPY --chown=node:node ./src/package*.json ./
RUN npm install
COPY --chown=node:node ./src .
.dockerignone
.git
*Dockerfile*
*docker-compose*
node_modules
狙いとしては、
・Node.jsのエラー時の再起動の管理は、dockerに任せる
・実行は、nodeユーザー
・ソースは、コンテナ内にコピーして実行する
この構成にたどり着くまでに苦労したのは、フォルダ、ファイルの権限です。
rootで実行するなら悩むことはありませんが、nodeユーザーで実行するために試行錯誤しました。
RUN chown node:node /app
がポイントです。
COPY --chown=node:node ./src/package*.json ./
の--chown=node:nodeは、この場合、不要だと思いますが、今後、Dockerfileを修正したときに忘れないように、残しておきました。