每次在nodejs应用程序中更改文件时,我都必须重建docker映像
这感觉很多余,而且会减慢我的工作流程。有没有一种正确的方法可以在不重新构建整个图像的情况下同步nodejs应用程序文件,或者这是一种正常的用法?
听起来您想要加快开发过程。在这种情况下,我建议使用docker run -v
选项将目录装载到容器中:https://docs.docker.com/engine/userguide/dockervolumes/#mount-主机定向即数据卷
一旦你完成了程序的开发,构建镜像,现在启动docker,不需要-v
选项。
我最终做的是:
1) 使用卷和docker run
命令-这样我就可以更改代码,而无需每次都重建docker映像。
2) 我遇到了一个node_modules被覆盖的问题,因为卷的行为就像装载一样——通过节点的PATH遍历修复了它。
Dockerfile:
FROM node:5.2
# Create our app directories
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
RUN npm install -g nodemon
# This will cache npm install
# And presist the node_modules
# Even after we are using the volume (overwrites)
COPY package.json /usr/src/
RUN cd /usr/src && npm install
#Expose node's port
EXPOSE 3000
# Run the app
CMD nodemon server.js
命令行:
构建:
docker build -t web-image
要运行:
docker run --rm -v $(pwd):/usr/src/app -p 3000:3000 --name web web-image
您也可以做一些事情,比如更改指令,它说在docker构建的构建上下文参数指定的目录中查找package.json
文件,然后将其复制到容器的当前工作目录中,然后是RUN npm install
,然后我们将COPY
覆盖其他所有内容,如下所示:
# Specify base image
FROM node:alpine
WORKDIR /usr/app
# Install some dependencies
COPY ./package.json ./
RUN npm install
# Setup default command
CMD ["npm", "start"]
您可以进行任意数量的更改,并且不会使此处任何步骤的缓存无效。
npm安装将再次执行的唯一时间是,如果我们对该步骤或其上面的任何步骤进行更改。
因此,除非您对package.json文件进行更改,否则npm安装将不会再次执行。
所以我们可以通过运行docker build -t <tagname>/<project-name> .
来测试这一点
现在我已经对Dockerfile
进行了更改,所以您将看到一些步骤重新运行,并最终成功标记和构建了图像。
Docker检测到对步骤及其后的每一步的更改,但没有检测到npm install
步骤。
这里的教训是,是的,它确实会改变所有这些指令在Dockerfile
中的放置顺序。
将这些操作分割开来以确保您只复制最少量的操作是很好的。