プロジェクトにdocker、docker-compose、nodejsを使用してdevelopmentとproductionの両方の環境を持つソリューションを探しています。
これにどのように取り組みますか?
基本的に私が欲しいのはdocker本番環境を開始するコマンドと私の開発環境を開始するコマンド(たとえば、nodemonを使用できます)です。
ここに私のDockerfileがあります
FROM node:13-Alpine
RUN mkdir /app
WORKDIR /app
COPY . /app
RUN npm install
RUN npm run build
EXPOSE 1234
CMD ["npm", "run", "prod"] # <--- Have a possibility to run something like "npm run dev" here instead
docker-compose.yml
version: "3"
services:
findus:
build: .
ports:
- "1234:1234"
links:
- mongo
container_name: myapp
mongo:
image: mongo
restart: always
ports:
- "4444:4444"
package.json
// ...
"scripts": {
"build": "tsc",
"dev": "nodemon source/index.ts",
"prod": "node build/index.js"
},
// ...
次のような構造を作成できます。
docker-compose.yml --> docker-compose.dev.yml docker-compose.prod.yml
基本構成が存在する場所docker-compose.yml
、ポートやユーザー資格情報などの環境固有の情報はdocker-compose.dev.yml
またはdocker-compose.prod.yml
そして、あなたは以下で開発環境を実行することができます:
docker-compose \
-f docker-compose.yml \
-f docker-compose.dev.yml \
up -d
または、以下の製品環境:
docker-compose \
-f docker-compose.yml \
-f docker-compose.prod.yml \
up -d
これを行う1つの方法は、次のようにDockerfileに2つの「ターゲット」を作成することです。
Dockerfile:
FROM node:13-Alpine As development
RUN mkdir /app
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:13-Alpine as production
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
WORKDIR /app
COPY package*.json ./
RUN npm install --only=production
COPY . .
COPY --from=development /app/dist ./dist
CMD ["node", "dist/index.js"]
そしてあなたのdocker-compose上のそれらは開発バージョンのみを実行します:
version: '3.7'
services:
main:
container_name: main
build:
context: .
target: development
command: npm run dev
...
したがって、開発環境では、次のコマンドを実行できます。
docker-compose up
製品版では、Dockerを直接実行できます
docker run-ターゲットの生産
「npm run build」を実行すると、dist/productionフォルダーが生成されると想定しているため、ルートフォルダーのindex.jsで直接実行するのではなく、そこにノードを実行することをお勧めします。