如何将npm包添加到docker图像而不用重新制作图像或容器?

问题:如何安装新软件包并获取docker映像和容器以识别更改,安装和重新运行而不与开发人员进行交互?

package.json注意我们只有一个包

"scripts": { "start": "node_modules/.bin/nodemon" }, "dependencies": { "express": "4.15.4" } 

dockerfile

 FROM node:8.4.0 ENV HOME /var/www WORKDIR ${HOME} COPY server/package.json server/tsconfig.json server/nodemon.json $HOME/ RUN npm install EXPOSE 8191 CMD [ "npm", "start" ] 

制作图片

 docker build . -t testImage 

运行容器

 docker run -p 8191:8191 -v $(pwd)/server/src:/var/www/src testImage 

一切工作正常[nodemon] starting节点[nodemon] starting src / index.js`

问题:

npm install cors --save 会添加cors包

 "scripts": { "start": "node_modules/.bin/nodemon" }, "dependencies": { "express": "4.15.4", "cors": "^2.8.4", } 

问题是什么都不会更新在我的docker容器:(我不希望开发人员必须重新制作图像或不得不重新运行一个容器: docker build . -t testImage docker run -p 8191:8191 -v $(pwd)/server/src:/var/www/src testImage

看看入口点和CMD是如何工作的,如果你想在生产和开发中使用相同的Dockerfile,你可以创build一个入口脚本,如果没有参数提供作为生产模式运行,如果像开发这样的参数,作为开发模式运行。

使用–save-dev保存开发包,所以当在开发模式下运行时,你的容器会安装开发依赖项。

确保你的node_modules在你的.dockerignore上,

你的dockerfile:

 FROM node:8.4.0 ENV HOME /var/www WORKDIR ${HOME} COPY start_scrip.sh /start_scrip.sh COPY server/package.json server/tsconfig.json server/nodemon.json $HOME/ RUN npm install EXPOSE 8191 ENTRYPOINT ["/start_scrip.sh"] 

一个start_scrip.sh例子:

 #!/usr/bin/env bash function development { npm install --dev # npm start } function run_prod { #npm start command here } if [ $# -gt 0 ] then if [ $1 == "development" ] then development else echo "Not a valid argument" exit 127 fi else run_prod fi exit 0 

确保chmod + x你的脚本,所以它可以在容器内执行。

以开发模式运行:

 run -p 8191:8191 -v $(pwd)/server/src:/var/www/src testImage development 

每当开发人员在工作站中添加一个新软件包时,他都应该重新启动容器。