每次我在nodejs应用程序中更改文件时,我都必须重建docker镜像 这感觉多余并且减慢了我的工作流程。是否有正确的方法来同步nodejs app文件而无需再次重建整个图像,或者这是正常用法吗?
答案 0 :(得分:1)
听起来你想加快开发过程。在这种情况下,我建议使用docker run -v
选项将您的目录挂载到容器中:https://docs.docker.com/engine/userguide/dockervolumes/#mount-a-host-directory-as-a-data-volume
完成程序开发后,构建图像,现在启动docker而不使用-v
选项。
答案 1 :(得分:0)
我最终做的是:
1)使用卷和docker run
命令 - 这样我就可以在不重建docker镜像的情况下更改代码。
2)我遇到了node_modules被覆盖的问题,因为卷的作用类似于mount - 用节点的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
答案 2 :(得分:0)
您可能还做了类似更改指令的操作,它说在docker build的build context参数指定的目录中查找并找到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
中的放置顺序。
很高兴将这些操作分段以确保您仅复制最低限度的内容。