我应该如何完成一个更好的Docker工作流



每次在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中的放置顺序。

将这些操作分割开来以确保您只复制最少量的操作是很好的。

相关内容

最新更新