我应该如何完成更好的Docker工作流程?

时间:2015-12-12 14:15:53

标签: node.js docker workflow

每次我在nodejs应用程序中更改文件时,我都必须重建docker镜像 这感觉多余并且减慢了我的工作流程。是否有正确的方法来同步nodejs app文件而无需再次重建整个图像,或者这是正常用法吗?

3 个答案:

答案 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中的放置顺序。

很高兴将这些操作分段以确保您仅复制最低限度的内容。