图片显示问题,附上有道云笔记中链接:http://note.youdao.com/noteshare?id=fba6d2f53fd6447ba32c3b7accfeb89b&sub=B36B5904A0804AF5AD3194AAA196F8C3

编写Dockerfile

FROM指令和MAINTAINER指令

脚本的第1行是FROM指令。通过FROM指令,docker编译程序能够知道在哪个基础镜像执行来进行编译。所有的Dockerfile都必须以FROM指令开始。第二条指令MAINTAINER,用来标明这个镜像的维护者信息。

RUN指令

接下来是RUN指令。这条指令用来在docker的编译环境中运行指定命令。上面这条指令会在编译环境运行/bin/sh -c "apt-get update && apt-get -y install ..."RUN指令还有另外一种格式:

RUN ["程序名", "参数1", "参数2"]

这种格式运行程序,可以免除运行/bin/sh的消耗。这种格式使用Json格式将程序名与所需参数组成一个字符串数组,所以如果参数中有引号等特殊字符,需要进行转义。

ENV指令

ENV指令用来指定在执行docker run命令运行镜像时,自动设置的环境变量。这些环境变量可以通过docker run命令的--evn参数来进行修改。

COPY指令和ADD指令

COPY指令用来将本地(Dockerfile所在位置)的文件或文件夹复制到编译环境的指定路径下。上面的例子里,boot2docker的Dockerfile希望将与Dockerfile同一目录下的kernel_config文件复制到编译环境的/linux-kernal/.config。Dockerfile还提供了另外一个类似的指令:ADD。在复制文件方面ADD指令和COPY指令的格式和效果是完全一样的。这两个指令的区别主要由两点:

  1. ADD指令可以从一个URL地址下载内容复制到容器的文件系统中;
  2. ADD指令会将压缩打包格式的文件解开后复制到指定位置,而COPY指令只做复制操作。

CMD指令

这是整个Dockerfile脚本的最后一条指令。当Dockerfile已经完成了所有环境的安装与配置,通过CMD指令来指示docker run命令运行镜像时要执行的命令。上面的例子里,在完成所有工作后,boot2docker的编译脚本将编译结果输出到本地环境下。

其他指令

上面我们通过boot2docker的Dockerfile脚本学习了几个最常用的指令。接下来我们再学习剩下的几个指令。

EXPOSE指令

EXPOSE <端口> [<端口>...]指令用于标明,这个镜像中的应用将会侦听某个端口,并且希望能将这个端口映射到主机的网络界面上。但是,为了安全,docker run命令如果没有带上响应的端口映射参数,docker并不会将端口映射出了。

ENTRYPOINT指令

ENTRYPOINT指令和前面介绍过的CMD一样,用于标明一个镜像作为容器运行时,最后要执行的程序或命令。这两个指令有相同之处,也有区别。通过两个指令的配合使用可以配置出不同的效果。

ENTRYPOINT指令有两种格式,CMD指令有三种格式:

ENTRYPOINT ["程序名", "参数1", "参数2"]
ENTRYPOINT 命令 参数1 参数2 CMD ["程序名", "参数1", "参数2"]
CMD 命令 参数1 参数2
CMD 参数1 参数2

ENTRYPOINT是容器运行程序的入口。也就是说,在docker run命令中指定的命令都将作为参数提供给ENTRYPOINT指定的程序。同样,上面列举的CMD指令格式的后面两种格式也将作为参数提供给ENTRYPOINT指定的程序。

默认的ENTRYPOINT/bin/sh -c。你可以根据实际需要任意设置。但是如果在一个Dockerfile中出现了多个ENTRYPOINT指令,那么,只有最后一个ENTRYPOINT指令是起效的。

一种常用的设置是将命令与必要参数设置到ENTRYPOINT中,而运行时只提供其他选项。例如:你有一个MySQL的客户端程序运行在容器中,而客户端所需要的主机地址、用户名和密码你不希望每次都输入,你就可以将ENTRYPOINT设置成:ENTRYPOINT mysql -u <用户名> -p <密码> -h <主机名>。而你运行时,只需要指定数据库名。

VOLUME指令

VOLUME ["路径"]

VOLUME指令用于在容器内创建一个或多个卷。而更多的时候,是在执行docker run时指定要创建的卷以及本地路径来进行映射。关于这个用法将在后面的章节学习到。

USER指令

USER 用户名或用户ID

USER指令用于容器内运行RUN指令或CMD指令的用户。例如,在构建一个nginx镜像时,你希望最后运行nginx的用户为nginx,就可以在CMD ["nginx"]之前将用户设置为nginx

如果在运行docker run命令时设置了-u 用户名参数,那么将覆盖USER指令设置的用户。

WORKDIR指令

WORKDIR 路径

WORKDIR指令用于设置执行RUN指令、CMD指令和ENTRYPOINT指令执行时的工作目录。在Dockerfile中可以多次设置WORKDIR,在每次设置之后的命令将使用新的路径。

ONBUILD指令

ONBUILD 指令

ONBUILD指令用于设置一些指令,当本镜像作为基础镜像被其他Dockerfile用FROM指令引用时,在所有其他指令执行之前先执行这些指令。

备注

举例说明 ENTRYPOINTCMD的区别

  • dockerfile 中只有CMD ["cat","/etc/passwd"],启动docker
docker run -itd --name docker_name docker_image

以上启动docker后,会直接执行cat /etc/passwd.和直接执行

docker run -itd --name docker_name docker_image cat /etc/passwd
  • dockerfile 中只有ENTRYPOINT ['cat'],启动docker
docker run -itd --name docker_name docker_image  /etc/passwd

以上启动docker后,会直接执行cat /etc/passwd.

  • dockerfile 中有ENTRYPOINT ["cat"]CMD ["/etc/passwd"] ,启动docker
docker run -itd --name docker_name docker_image

以上启动docker后,会直接执行cat /etc/passwd.

如果在启动命令后在加入其他参数

docker run -itd --name docker_name docker_image  cat /etc/shadow

实际会执行: cat /etc/passwd cat /etc/shadow .这样就是错误的

示例讲解

Dockerfile

FROM hub.geovis.io/isphere/ubuntu:18.04_ali  ##基础镜像

RUN mkdir -p /opt/app/ \    ##容器中创建 /opt/app和/nfs/data两个文件夹
mkdir -p /nfs/data/ \ WORKDIR /opt/app/ ## 切换到/opt/app下,一下命令会在/opt/app下执行 COPY requirements.txt /opt/app ## 将本地的requirements.txt文档拷贝到容器的/opt/app下 RUN \
pip3 install -r requirements.txt ## 执行命令,安装依赖包 COPY . /opt/app/ ## 将本地其他相关文件拷贝到容器/opt/app下 EXPOSE 5000 ## 容器申请端口5000 ENTRYPOINT ["python3"] CMD ["-m", "swagger_server"] ##docker run时,会直接执行 python3 -m swagger_server

本地目录结构

打包命令

在Dockerfile的目录下执行

docker build -t dockerimage:tag  .

Dockerfile文档编写的更多相关文章

  1. PHP 高级编程(1/5) - 编码规范及文档编写

    PHP 高级程序设计学习笔记20140612 软件开发中的一个重要环节就是文档编写.他可以帮助未来的程序维护人员和使用者理解你在开发时的思路.也便于日后重新查看代码时不至于无从下手.文档还有一个重要的 ...

  2. 从零开始编写自己的C#框架(4)——文档编写说明

    在写本系列的过程中,了解得越多越不知道从哪里做为切入点来写,几乎每个知识点展开来说都可以写成一本书.而自己在写作与文档编写方面来说,还是一个初鸟级别,所以只能从大方面说说,在本框架开发所需的范围内来讲 ...

  3. show一下自己的文档编写功底

    以我为例,我绝对相信,“才华”和颜值成反比.这里我要秀一下我的文档编写能力.在我这十年的工作生涯里,的确有数不清的次数,我的同事或上司,对我设计和制作的文档表示称赞. 我曾记得,2010年我在好丽友— ...

  4. 利用Gulp实现JSDoc 3的文档编写过程中的实时解析和效果预览

    ### 利用Gulp实现JSDoc 3的文档编写过程中的实时解析和效果预览 http://segmentfault.com/a/1190000002583569

  5. VS Code 搭建合适的 markdown 文档编写环境

    写在开头,之前我是使用Gitee与Github作为图床和Picgo搭配Typora使用的 ,但因为最近觉得这样还是稍微比较繁琐,然后因为VS Code是我的主要文本编辑器.Cpp,Python等均是在 ...

  6. Android 手机卫士--参照文档编写选择器

    本文来实现<Android 手机卫士--导航界面1的布局编写>中的图片选择器部分的代码. 本文地址:http://www.cnblogs.com/wuyudong/p/5944356.ht ...

  7. showdoc app接口文档编写利器

    通过朋友介绍,才知道有这么好的一个在线接口编写文档开源项目,非常感谢原作者的贡献 ShowDoc介绍 关于ShowDoc的介绍,请访问:http://blog.star7th.com/2015/11/ ...

  8. vscode使用Markdown文档编写

    首先安装vscode工具,具体的使用可以参考之前的博文:<Visual Studio Code教程:基础使用和自定义设置> VScode已经默认集成markdown文档编辑插件.可以新建一 ...

  9. dockerfile文档的相关参数

    以上是用dockerfile来构建的nginx镜像示例. 一.构建stress压力测试软件镜像 ##(1) 以下是Dockerfile内容(ENTRYPOINT是运行的环境): FROM centos ...

随机推荐

  1. 题解【洛谷P1379】八数码难题

    题面 典型的\(\text{BFS}\). 双向广搜是一种对\(\text{BFS}\)的优化,它适用于起点和终点都明确的题目. 这里给出我的双向广搜模板. inline int bfs()//双向广 ...

  2. 记录 shell学习过程(6)while 以及 while的嵌套 以及 until

    while中的5种条件 1.数学比较 read -p "Num :" num1 ] do echo 'greater' sleep done 2.字符串比较 read -p &qu ...

  3. 《TCP/IP入门经典》摘录--Part 3

    TCP/IP协议系统 3.子网划分和CIDR 子网 划分网络 为什么需要划分子网? 子网划分就是在网络 ID 之下提供了第 2 层逻辑组织.路由器能够把数据报发送给网络里的某个子网地址(一般对应于一个 ...

  4. ubuntu 离线装包

    1,为什么要离线装包 防止有些包官方升级以后导致的不兼容,比如php5和php7,目前已经无法apt-get install php5了, 2,装包以前你得有安装包文件,deb或者是run deb包在 ...

  5. mysql 原有的主键情况下设置自增字段

    mysql 的自增字段只能是主键,如果原表已经有主键,需要设置自增字段应该怎么做呢? 1.alter table bu_staff  drop primary key;  先删除表的主键  id为原表 ...

  6. springboot13(redis缓存)

    redis做springboot2.x的缓存 1.首先是引入依赖 <dependency> <groupId>org.springframework.boot</grou ...

  7. 关于QImage和IplImage之间转换的实现

    在嵌入式系统中实现qt和opencv的处理,最基础的就是QImage和IplImage之间的转换.这样两者就可以进行一起使用图像数据,从而达到利用qt显示和利用opencv处理的功能. 下面我将贴出代 ...

  8. Android开发实战——记账本(5)

    开发日志——(5)     今天打算将图标的功能实现,将打开图表的选项放在右上方,所以重写MainActivity中的onOptionsItemSelected方法.增添Chart选项 public ...

  9. Yii2.0 高级版修改默认访问控制器

    frontend->config->main-local.php $config = [ 'defaultRoute' => 'index/index',//修改默认访问控制器 'c ...

  10. 2019年牛客多校第一场B题Integration 数学

    2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...