我有一个简单的node.js应用程序.我可以使用一个简单的Dockerfile构建一个运行应用程序的容器,如下所示:
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y nodejs nodejs-legacy npm
COPY . /app
WORKDIR /app
RUN npm install
CMD node index.js
但是对于开发,我不想为我的代码中的每个更改重建容器.很自然地,我将一个音量组合用于nodemon.这是我的问题:
>如何保持不同的配置?两个dockerfiles?使用compose与两个不同的撰写文件?
>我的主机上的node_nodules文件夹与我在容器中需要的文件夹不同(即一些软件包全局安装在主机上).我可以将其从卷中排除吗?如果是这样,我需要在安装卷后运行npm install.我该怎么做呢?
所以我的问题是:我如何将开发和部署环境分开.两个Dockerfiles?两个撰写文件?有没有最佳做法?
最佳答案
所以我处理它的方式是我有2个Docker文件(Dockerfile和Dockerfile.dev).
原文链接:/docker/435870.html在Dockerfile.dev我有:
FROM node:6
# Update the repository
RUN apt-get update
# useful tools if need to ssh in or used by other tools
RUN apt-get install -y curl net-tools jq
# app location
ENV ROOT /usr/src/app
COPY package.json /usr/src/app/
# copy over private npm repo access file
ADD .npmrc /usr/src/app/.npmrc
# set working directory
WORKDIR ${ROOT}
# install packages
RUN npm install
# copy all other files over
COPY . ${ROOT}
# start it up
CMD [ "npm","run","start" ]
# what port should I have
EXPOSE 3000
我的NPM脚本看起来像这样
"scripts": {
....
"start": "node_modules/.bin/supervisor -e js,json --watch './src/' --no-restart-on error ./index.js","start-production": "node index.js",....
},
您将注意到它使用supervisor启动,因此对src下的任何文件的任何更改都将导致它重新启动服务器而无需重新启动到docker.
最后是码头组合.
dev:
build: .
dockerfile: Dockerfile.dev
volumes:
- "./src:/usr/src/app/src"
- "./node_modules:/usr/src/node_modules"
ports:
- "3000:3000"
prod:
build: .
dockerfile: Dockerfile
ports:
- "3000:3000"
所以你在开发模式下看到它加载并将当前目录的src文件夹加载到/usr/src / app / src中的容器,并将node_modules目录加载到/usr/src / node_modules.
这使得我可以在本地进行更改并保存,卷将更新容器的文件,然后主管将看到更改并重新启动服务器.