我应该如何完成更好的 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 中的放置顺序确实有所不同。

最好将这些操作分段,以确保您只复制最低限度的内容。