Dockerfile基础一文通
## 简介 使用docker简单来说就三步:1.构建镜像、2.获取镜像、3.基于镜像启动容器。大多数
渲染中...
## 简介 使用docker简单来说就三步:1.构建镜像、2.获取镜像、3.基于镜像启动容器。大多数人工作中可能只会用到后两步,但真正学会docker第一步也是必不可少的! 构建镜像离不开`Dockerfile`,本文就来解析`Dockerfile`中各种指令的作用。 提示:本文基于本人使用经验编写,如有错误欢迎指正,附【[官方Dockerfile参考文档](https://docs.docker.com/engine/reference/builder/)】! <!-- more --> **之前写过一个简单的实例,可以参考:[Dockerfile构建Springboot镜像](https://oldmoon.top/post/21)** ## 指令解析 ### LABEL - 基础作用:添加镜像的一些自定义说明,如:作者、时间、镜像描述等等一些自己觉得有必要的东西。 - 示例 > 示例中的key是自定义的,如果你觉得`author.name`没必要,完全可以改成`author`,这是完全自定义的。 ```dockerfile # 作者名 LABEL author.name="DingDangDog" # 作者邮箱 LABEL author.email="[email protected]" # 项目名 LABEL project.name="cashbook-server" # 项目版本 LABEL project.version="0.0.1" # 项目描述 LABEL project.description="this project is cashbook's server" ``` ### FROM - 基础作用:以某个镜像为基础,构建自定义镜像。如:`FROM openjdk:8-jdk`:以`openjdk`镜像的`8-jdk`版本为基础。 - 高级使用:有时我们会发现一个`Dockerfile`文件中有个多个`FROM`指令,这既是高阶使用。使用多FROM指令可以完成多阶段编译,每一条`FROM`指令都是一个构建阶段,多条`FROM`就是多阶段构建,虽然最后生成的镜像只能是最后一个阶段的结果,但是,能够将前置阶段中产生的文件拷贝到后边的阶段中,这就是多阶段构建的最大意义。 ### ENV - 基础作用:设置环境变量。可以在编译时就设置一些环境变量的默认值,在镜像内部的容器中可以读到这些环境变量值,如现在大多数前端node项目使用的`process.env.***`。 - 拓展:环境变量在启动容器的命令中也可以指定,并会覆盖构建脚本`Dockerfile`中的默认值。如:`docker run --env env=dev -d -p 8888:8080 balance`,其中`--env env=dev`就是设置环境变量`env`的值为`dev`。 ### RUN - 基础作用:运行一些脚本,一般是`sh`脚本,常见用法是安装一些三方工具包,以拓展镜像支持的功能。如更新 `apt-get` 并安装某些工具包: ```Dockerfile RUN apt-get update && apt-get install -y package-name ``` ### COPY - 基础作用:将指定文件/文件夹拷贝到镜像中,如: ```Dockerfile COPY ./local-dir /app/ ``` ### ADD - 基础作用:将指定文件/文件夹添加到镜像中。类似于 COPY,但功能更强大,可以从 URL 复制文件并自动解压缩。如: ```Dockerfile ADD https://example.com/file.tar.gz /app/ ``` ### WORKDIR - 设置工作目录,即在镜像中后续执行命令时的默认路径。 ### ENTRYPOINT - 基础作用:镜像作为容器启动时,执行的脚本/可执行文件等。一般用于最终启动服务的脚本,如:`ENTRYPOINT [ "node", "./dist/main.js" ]` 与 CMD 不同的是,ENTRYPOINT 指令的参数不会被 Dockerfile 中的 CMD 覆盖,而是作为 ENTRYPOINT 的参数。 ### EXPOSE - 声明容器运行时监听(暴露)的端口,如:`EXPOSE 8080` ### VOLUME - 声明匿名数据卷,用于持久化数据。如:`VOLUME /data` ## 总结 以上这些指令是 Dockerfile 中常用的一些指令,可以根据具体需求灵活使用,要想体会指令的实际作用,还需要你自己动手取实践! ## 赞助请求V3 **建站因为热爱,生活需要Money,请屏幕前的大佬动动您发财的小手,点击一次以示鼓励,祝您生活愉快!** <!-- 文章内嵌广告位 --> <div class="article-ads"></div> > PS:就目前的访问量,即便每个访客都点一次广告,收入也不足以支付运营成本。`如果看不到广告,可能是网络原因或被拦截了,那就算了吧。再次祝您生活愉快~~`
END
评论
登录后查看和发表评论
前往登录