我正在寻找一种使用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
您可以使用入口点并将命令传递到Docker容器。然后,您可以使用docker-compose inharitance启动所需环境的compose并将命令附加到入口点。
Dockerfile:
FROM node:13-alpine
RUN mkdir /app
WORKDIR /app
COPY . /app
RUN npm install
RUN npm run build
EXPOSE 1234
ENTRYPOINT ["npm", "run"]
Main docker-compose.yml:
version: "3"
services:
findus:
build: .
ports:
- "1234:1234"
links:
- mongo
container_name: myapp
mongo:
image: mongo
restart: always
ports:
- "4444:4444"
然后有两个docker-compose文件,将传递的命令附加到映像入口点。为了开发-docker-compose.dev.yml:
version: "3"
services:
findus:
command: dev
和docker-compose.prod.yml:
version: "3"
services:
findus:
command: prod
然后启动开发环境:
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
并且适用于产品环境:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
因此command
将附加到ENTRYPOINT
指令中。
如果您要将命令作为环境变量传递,此方法也可以与环境变量一起使用。您可以在docs中找到更多信息。
一种方法是像这样在Dockerfile上创建两个“目标”:
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 --target production
我假设当您运行“ npm run build”时,您正在生成一个dist / production文件夹,因此最好在该目录中运行节点,而不是直接在根文件夹中运行index.js。