如何将npm包添加到没有重建图像或容器的docker镜像?

时间:2017-09-09 18:22:59

标签: node.js docker npm dockerfile npm-install

问题: 如何安装新软件包并让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节点工作./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

1 个答案:

答案 0 :(得分:0)

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

使用--save-dev保存开发包,因此在开发模式下运行时,容器将安装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

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