我应该如何完成更好的 Docker 工作流程?
How should I Accomplish a Better Docker Workflow?
每次我在 nodejs 应用程序中更改文件时,我都必须重建 docker 图像。
这感觉多余并且减慢了我的工作流程。是否有正确的方法来同步 nodejs 应用程序文件而无需再次重建整个图像,或者这是正常用法?
听起来您想加快开发进程。在这种情况下,我建议使用 docker run -v
选项将目录挂载到容器中:https://docs.docker.com/engine/userguide/dockervolumes/#mount-a-host-directory-as-a-data-volume
完成程序开发后构建映像,现在开始 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 build 的构建上下文参数指定的目录中查找并找到 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 install 的情况是我们对该步骤或它上面的任何步骤进行更改。
因此,除非您对 package.json 文件进行更改,否则不会再次执行 npm install。
所以我们可以通过 运行 对 docker build -t <tagname>/<project-name> .
进行测试
现在我对 Dockerfile
进行了更改,因此您将看到一些重新 运行 的步骤,最终我们成功标记并构建了图像。
Docker 检测到步骤及其后每个步骤的更改,但未检测到 npm install
步骤。
这里的教训是,是的,所有这些指令在 Dockerfile
中的放置顺序确实有所不同。
最好将这些操作分段,以确保您只复制最低限度的内容。
每次我在 nodejs 应用程序中更改文件时,我都必须重建 docker 图像。
这感觉多余并且减慢了我的工作流程。是否有正确的方法来同步 nodejs 应用程序文件而无需再次重建整个图像,或者这是正常用法?
听起来您想加快开发进程。在这种情况下,我建议使用 docker run -v
选项将目录挂载到容器中:https://docs.docker.com/engine/userguide/dockervolumes/#mount-a-host-directory-as-a-data-volume
完成程序开发后构建映像,现在开始 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 build 的构建上下文参数指定的目录中查找并找到 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 install 的情况是我们对该步骤或它上面的任何步骤进行更改。
因此,除非您对 package.json 文件进行更改,否则不会再次执行 npm install。
所以我们可以通过 运行 对 docker build -t <tagname>/<project-name> .
现在我对 Dockerfile
进行了更改,因此您将看到一些重新 运行 的步骤,最终我们成功标记并构建了图像。
Docker 检测到步骤及其后每个步骤的更改,但未检测到 npm install
步骤。
这里的教训是,是的,所有这些指令在 Dockerfile
中的放置顺序确实有所不同。
最好将这些操作分段,以确保您只复制最低限度的内容。