Dockerfile是用来自定义构建镜像的文件。

Dockerfile:

FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
  • FEOM : 指定基于哪个镜像进行自定义
  • RUN : 运行指令, 两种形式
    • RUN 命令
    • RUN ["test.php", "dev", "offline"] 等价于 test.php dev offline

docker 在每一行上新建一层,为了避免过多的层,用 && 把一些命令缩成一行

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz 以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
[root@localhost dockerdir]# docker build -t imagetest:test .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> 8cf1bfb43ff5
Step 2/2 : RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
---> Using cache
---> 2611d7938c46
Successfully built 2611d7938c46
Successfully tagged imagetest:test [root@localhost dockerdir]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
imagetest test 2611d7938c46 2 hours ago 132MB
twilight/nginx ali 378d7ca4a813 3 hours ago 229MB
mysystem tags 1c174e9fbdee 3 hours ago 64.2MB
ubuntu 18.04 2eb2d388e1a2 6 days ago 64.2MB
nginx latest 8cf1bfb43ff5 9 days ago 132MB
training/webapp latest 6fae60ef3446 5 years ago 349MB
[root@localhost dockerdir]#

docker build 会将上下文路径中的所有文件打包发送给引擎,所以上下文路径不能放无用的文件,会造成执行过程的缓慢。

指令

  • COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"] : 目的路径不存在会自动创建。路径支持通配符。

  • ADD 用法与 COPY一致,不同之处在于源文件为 gzip, bzip2, xz格式,会自动解压并复制到目标路径下。

    • 如果目标路径指定的是一个文件,则会覆盖这个文件(即使这个文件已经有内容),不存在就创建新文件
    • 如果目标路径是一个目录,但是这个目录不存在,docker会自动创建目录
  • CMD ["<可执行文件或命令>","<param1>","<param2>",...] CMD <shell 命令> ,用于在容器构建完成后执行的指令

    • 可以写多条CMD,但是只有最后一条会生效
    • Dockerfile中的CMD命令可以被 docker run -it ubuntu 命令中的命令覆盖。
    • RUN是运行在build的时期,而CMD运行在 docker run的时期
  • ENTRYPOINT ["<executeable>","<param1>","<param2>",...] 或者 ENTRYPOINT 命令 跟CMD的效果差不多,但是它始终会执行,或者被替换

    • 如果有多条 ENTRYPOINT命令,那么只有最后一条会生效
    • 如果定义了 ENTRYPOINT ["nginx", "-c"]那么在 docker run后面的参数会被追加到 nginx -c 的后面
    • 如果 ENTRYPOINT ["nginx", "-c"]CMD [""] 同时使用, CMD中的内容也会被追加到 ENTRYPOINT的后面
    • 通过指定 --entrypoint 命令 参数 来覆盖ENTRYPOINT的内容
  • ENV <key> <value> 或者 ENV <key1>=<value1> <key2>=<value2>: 定义的环境变量可以在build和run的时候以 $var的形式引用

  • ARG 和 ENV作用一样,但是仅限于在Dockerfile内生效,可以在 docker build --build-arg key=value来覆盖

  • VOLUME ["<路径1>", "<路径2>"...] 自动挂载数据卷

  • EXPOSE <端口1> [<端口2>...] 声明端口,方便配置

  • WORKDIR <工作目录路径> 目录必须已经存在,在构建镜像的每一层中,该目录都会存在。

  • USER <用户名>[:<用户组>] 切换用户

  • ONBUILD 本次不会执行,但是如果有新的Dockerfile引用了这个镜像,就会执行ONBUILD指定的命令

参考资料

https://www.runoob.com/docker/docker-dockerfile.html

https://blog.csdn.net/shunfa888/article/details/79373840

关于Dockerfile的写法的更多相关文章

  1. Docker(五)如何构建Dockerfile

    摘自 https://mp.weixin.qq.com/s/_hq9dPe6390htN8BTkoQeQ 一.Dockerfile的指令集 由于Dockerfile中所有的命令都是以下格式:INSTR ...

  2. Dockerfile编写的注意事项

    一.Dockerfile合理分层 Dockerfile的写法不合理,有时候会导致镜像膨胀,由于Docker是分层设计,而在Dockerfile中,每一条指令都拥有自己的context,而执行到下一条指 ...

  3. 最简单的dockerfile使用教程 - 创建一个支持SSL的Nginx镜像

    什么是dockerfile?简单的说就是一个文本格式的脚本文件,其内包含了一条条的指令(Instruction),每一条指令负责描述镜像的当前层(Layer)如何构建. 下面通过一个具体的例子来学习d ...

  4. 你确定你会写 Dockerfile 吗?

    如今 GitHub 仓库中已经包含了成千上万的 Dockerfile,但并不是所有的 Dockerfile 都是高效的.本文将从五个方面来介绍 Dockerfile 的最佳实践,以此来帮助大家编写更优 ...

  5. Docker Dockerfile 指令详解与实战案例

    Dockerfile介绍及常用指令,包括FROM,RUN,还提及了 COPY,ADD,EXPOSE,WORKDIR等,其实 Dockerfile 功能很强大,它提供了十多个指令. Dockerfile ...

  6. Dockerfile优化方式

    如今GitHub 仓库中已经包含了成千上万的Dockerfile,但并不是所有的Dockerfile都是高效的.本文将从四个方面来介绍Dockerfile的最佳实践,以此来帮助大家编写更优雅的Dock ...

  7. [CoreOS 转载] CoreOS实践指南(七):Docker容器管理服务

    转载:http://www.csdn.net/article/2015-02-11/2823925 摘要:当Docker还名不见经传的时候,CoreOS创始人Alex就预见了这个项目的价值,并将其做为 ...

  8. Docker镜像压缩

    一.Dockerfile合理分层 Dockerfile的写法不合理,有时候会导致镜像膨胀,由于Docker是分层设计,而在Dockerfile中,每一条指令都拥有自己的context,而执行到下一条指 ...

  9. 从零开始搭建Jenkins+Docker自动化集成环境

    本文只简单标记下大概的步骤,具体搭建各个部分的细节,还请自行搜索.第一.二部分只是对Jenkins和Docker的简单介绍,熟悉的同学请直接跳到第三部分. 一.关于Jenkins Jenkins简介 ...

随机推荐

  1. 超实用在线工具!能将文字加密为Emoji表情

    试想一下,如果你需要将一段比较敏感的内容发送给你的好友. 但如果这段内容不小心外泄,被别人看到了,可能会带来很多麻烦. 那么,有什么方法能够让传输的文本内容不那么容易被"看破"呢? ...

  2. apk编辑器测评

    hi你好,我今天要介绍的就是apk编辑器 这里我用的是apk编辑器专业版 APK编辑器 关于 APK 编辑器智友汉化组论坛:bbs.zhiyoo.com修改应用程序名称美化 UI: 更改背景图片删除广 ...

  3. 微软Azure配置中心 App Configuration (三):配置的动态更新

    写在前面 我在前文: <微软Azure配置中心 App Configuration (一):轻松集成到Asp.Net Core>已经介绍了Asp.net Core怎么轻易的接入azure ...

  4. [CF1537E] Erase and Extend (字符串)

    题面 给一个长度为 n \tt n n 的字符串,你可以进行无限次以下两种操作之一: 删去末尾的字符(此时要保证删去后字符串非空). 把当前整个字符串复制一份,接到自己的后面. 输出最终通过操作能达到 ...

  5. CCF NOI Online 2021 提高组 T3 岛屿探险(CDQ 分治,Trie 树)

    题面 凇睦是一个喜欢探险的女孩子,这天她到一片海域上来探险了. 在这片海域上一共有 n 座岛屿排成一排,标号为 1, 2, 3, . . . , n.每座岛屿有两个权值,分别为劳累度 ai 和有趣度 ...

  6. 【面试题】Vue中的$router 和 $route的区别

    Vue中的$router 和 $route的区别 点击视频讲解更加详细 this.$route:当前激活的路由的信息对象.每个对象都是局部的,可以获取当前路由的 path, name, params, ...

  7. Windows平台真实时毫秒级4K H264/H265直播技术方案

    背景 在刚提出4K视频的时候,大多数人都觉得没有必要,4K的出现,意味着更高的硬件规格和传输要求,1080P看的很爽.很清晰,完全满足了日常的需求.随着电视的尺寸越来越大,原本1080P成像已经无法满 ...

  8. KingbbaseES V8R6集群维护案例之---集群之间数据迁移

    案例说明: 生产环境是集群环境,测试环境是集群,现需要将生产环境的数据迁移到测试集群中运行,本文档详细介绍了从集群环境迁移数据的操作步骤,可以作为生产环境迁移数据的参考. 适用版本: Kingbase ...

  9. KingbaseES R3集群备库执行sys_backup.sh物理备份案例

    案例说明: KingbaseES R3的后期版本支持通过sys_backup.sh执行sys_rman的物理备份,实际上是调用了sys_rman_v6的工具做物理备份.本案例是在备库上执行集群的备份, ...

  10. Unity-编辑器拓展之GUILayout,EditorGUILayout布局 { }

    Unity 脚本 API 中文版 链接: https://docs.unity3d.com/cn/2019.4/ScriptReference/ 创建自定义窗口 public class MyWind ...