那么我们可不可以做一个基础镜像,然后各个项目使用这个基础镜像呢?这样基础镜像更新,各个项目不用同步 Dockerfile 的变化,重新构建后就继承了基础镜像的更新?好吧,可以,让我们看看这样的结果。那么上面的这个 Dockerfile 就会变为:
FROM node:slim
RUN mkdir /app
WORKDIR /app
CMD [ "npm", "start" ]这里我们把项目相关的构建指令拿出来,放到子项目里去。假设这个基础镜像的名字为 mynode 的话,各个项目内的自己的 Dockerfile 就变为:
FROM my-node
COPY ./package.json /app
RUN [ "npm", "install" ]COPY . /app/基础镜像变化后,各个项目都用这个 Dockerfile 重新构建镜像,会继承基础镜像的更新。
那么,问题解决了么?没有。准确说,只解决了一半。如果这个 Dockerfile 里面有些东西需要调整呢?比如 npm install 都需要加一些参数,那怎么办?这一行 RUN 是不可能放入基础镜像的,因为涉及到了当前项目的 ./package.json ,难道又要一个个修改么?所以说,这样制作基础镜像,只解决了原来的 Dockerfile 的前4条指令的变化问题,而后面三条指令的变化则完全没办法处理。
ONBUILD 可以解决这个问题。让我们用 ONBUILD 重新写一下基础镜像的 Dockerfile :
FROM node:slim
RUN mkdir /app
WORKDIR /app
ONBUILD COPY ./package.json /app
ONBUILD RUN [ "npm", "install" ]ONBUILD COPY . /app/
CMD [ "npm", "start" ]这次我们回到原始的 Dockerfile ,但是这次将项目相关的指令加上 ONBUILD ,这样在构建基础镜像的时候,这三行并不会被执行。然后各个项目的 Dockerfile 就变成了简单地:
FROM my-node
是的,只有这么一行。当在各个项目目录中,用这个只有一行的 Dockerfile 构建镜像时,之前基础镜像的那三行 ONBUILD 就会开始执行,成功的将当前项目的代码复制进镜像、并且针对本项目执行 npm install ,生成应用镜像。
参考:https://github.com/yeasy/docker_practice
您可能感兴趣的文章:Docker中镜像构建文件Dockerfile与相关命令的详细介绍Dockerfile制作官方Tomcat镜像及镜像使用详解如何通过vs2017的Dockerfile来生成镜像利用Dockerfile制作java运行环境的镜像的方法步骤详解docker中Dockerfile指令创建镜像Docker使用Dockerfile来创建镜像docker中Dockerfile方式建立镜像HelloWorldDocker如何使用Dockerfile构建镜像docker使用Dockerfile构建镜像的方法使用dockerfile构建nginx镜像的方法示例基于alpine用dockerfile创建的爬虫Scrapy镜像的实现










