如何将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
每当开发人员在工作站中添加一个新软件包时,他都应该重新启动容器。