一、dockerfile基本结构

最简单的理解就是dockerfile实际上是一些命令的堆叠,有点像最基础的shell脚本,没有if 没有for,就是串行的一堆命令。

一般而言,dockerfile分为四个部分:基础镜像信息、维护者信息、镜像操作指令和启动时执行指令,例如:

#基础镜像信息
FROM ubuntu #维护者信息
MAINTAINER slim_liu slim_liu@.com #镜像操作指令 RUN apt-get update && apt-get install -u nginx #启动容器时执行的指令 CMD /usr/sbin/nginx

二、镜像操作指令

指令分为很多种,下面一一列举:

指令一般格式为 INSTRUCTION arguments ,指令包括FROM、MAINTAINER、RUN 等。

2.1 FROM

格式:

FROM <image>或FROM <image>:<tag>

Dockerfile 的开头,必须是FROM,如果在同一个dockerfile中创建多个镜像,可以使用多个from,每个镜像一次。

2.2 MAINTAINER

格式:

MANINTAINER <name>,指定维护者信息

2.3 RUN

格式:

RUN <command>或RUN ["executable", "param1", "param2"]

前者将在shell终端中执行命令,即 /bin/sh -c。后者则使用exec执行,指定终端,可以使用第二种,RUN ["/bin/bash", "-c" , "echo hello!"]

2.4 CMD

CMD支持三种格式:

CMD ["executable", "param1", "param2"]#使用exec执行,推荐方式。
CMD command param1 param2 #在/bin/sh 中执行,提供给需要交互的应用。
CMD ["param1", "param2"] #提供给ENTRYPOINT 的默认参数。

每个dockerfile只能指定一条CMD指令,如果有多条,则只会执行最后一条,并且如果启动容器时,指定了运行的命令,则会覆盖掉CMD指定的命令。

2.5 EXPOSE

格式:

EXPOSE <port> <port> ...
例:
EXPOSE 80 443 3306

告诉docker容器暴露的端口号,供互联系统使用。在启动容器时,需要通过-P,docker主机会自动分配一个端口转发到指定的端口,如果使用-p,则可以具体的指定端口映射关系。

2.6 ENV

格式:

ENV <key> <value> #指定一个环境变量,会被后续的RUN变量使用,并且会在容器中保持。
例:
ENV A
RUN curl -SL http://test.com/temp-$A.tar.gz

2.7 ADD

格式:

ADD <src> <dest>

复制指定的src到容器中的dest,src可以是dockerfile相对路径的目录、url、tar文件(将自动解压成目录)等

2.8 COPY

格式:

COPY <src> <dest>

复制本地主机的src(为dockerfile所在目录的相对路径,文件或目录)为容器中的dest,目标路径不存在时,会自动创建,当使用本地目录为源目录时,推荐使用COPY。

2.9 ENTRYPOINT

格式1:

ENTRYPOINT ["executable", "param1", "param2"]

格式2:

ENTRYPOINT command param1 param2 (#shell中执行)

配置容器启动时执行的命令,并且不能被docker run 提供的参数覆盖。

每个dockerfile只能有一个此参数,多个时候,只有最后一个生效。

2.10 VOLUME

格式:

VOLUME <"/data">

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

2.11 USER

格式:

USER daemon

指定运行容器时的用户名或UID,后续的RUN命令也会使用指定用户。

当容器不需要管理员权限时,建议添加USER参数,例如:

RUN groupadd -r postgres && useradd -r -g postgres postgres #需要临时获取管理员权限,可以使用gosu,不推荐sudo。

2.12 WORKERDIR

格式:

WORKERDIR /path/workerdir

为后续的RUN CMD ENTRYPOINT等指令配置工作目录。

可以使用多个WORKERDIR,如果后续的参数是相对路径,将基于之前的WORKERDIR

例:

WORKERDIR /a
WORKERDIR b
WORKERDIR c RUN pwd /a/b/c

2.13 ONBUILD

格式:

ONBUILD [INSTRUCTION]

配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。

例:

我们首先创建了image-a,并在其中使用了ONBUILD

[...]
ONBUILD ADD . /src/ ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

接着我们from image-a创建image-b,就会自动执行上面的两句。

如果使用ONBUILD指令的镜像,推荐在标签中注明,例如,ruby:1.9-onbuild

ubuntu-docker入门到放弃(七)Dockerfile简介的更多相关文章

  1. Docker入门教程(七)Docker API

    Docker入门教程(七)Docker API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第七篇,重点介绍了Docker Registry API和 ...

  2. Docker入门(一):简介

    这个<Docker入门>系列文档,是我根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家 ...

  3. docker入门到放弃

    1.容器简介 Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的cgroup,namespace,Union FS等技术,对应用进程进行封装隔离,并且独立于宿主机与其他进程, ...

  4. Docker入门与实践之 Dockerfile 语法详解

    一.Dockerfile 概述 Dockerfile是docker程序的解释脚本文件,Dockerfile 是一条一条的指令,Docker程序将dockerfile中的一条条指令编译成Linux可执行 ...

  5. MyBatis从入门到放弃七:二级缓存原理分析

    前言 说起mybatis的一级缓存和二级缓存我特意问了几个身边的朋友他们平时会不会用,结果没有一个人平时业务场景中用. 好吧,那我暂且用来学习源码吧.一级缓存我个人认为也确实有些鸡肋,mybatis默 ...

  6. Docker入门

    -----------------------------------------Docker入门教程(一)介绍Docker入门教程(二)命令Docker入门教程(三)DockerFileDocker ...

  7. Docker入门教程(三)Dockerfile

    Docker入门教程(三)Dockerfile [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第三篇,介绍了Dockerfile的语法,DockerOn ...

  8. Docker入门之七Dockerfile

    Dockerfile是一个文本格式的配置文本,可以使用它来创建自定义的镜像.首先我们可以先看一个dockerfile是什么样子.这里可以有一个网站不错:http://dockerfile.github ...

  9. Docker入门(七):部署app

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  10. 【实战】Docker 入门实战一:ubuntu 和 centos 安装Docker

    Docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布 ...

随机推荐

  1. hbuider配置初始

    { "forEach": { "prefix": "fec", "body": [ ".forEach(fun ...

  2. 微信支付---公众号支付和H5支付区别

    微信支付分为如下几种:(来源https://pay.weixin.qq.com/wiki/doc/api/index.html) 本文主要讲解公众号支付和H5支付,两者均属于线上支付比较常用的方式: ...

  3. 菜鸟webpack教程纠错

    gei事例: http://www.runoob.com/w3cnote/webpack-tutorial.html 本次的问题主要是在loader部分,原因是按照教程的操作,会出现一下错误 后来发现 ...

  4. wonder vscode plugins

    ├─ .obsolete├─ .wlck├─ .wtid├─ 1194979849.code-snippets-0.1.18├─ abeyuhang.vscode-lesslint-0.0.1├─ a ...

  5. Andriod Studio两种签名机制V1和V2的区别

    Android Studio 2.2以上版本打包apk的时候,我们会发现多了个签名版本(v1.v2)选择,如下图红色方框所示 问题描述(v1和v2) Android 7.0中引入了APK Signat ...

  6. SpringApplication执行流程

    SpringApplication类的直接作用是在main方法中通过自有的run方法启动spring应用. 具体的run方法为: public static ConfigurableApplicati ...

  7. linux c++ curl https 请求并双向验证SSL证书

    1.配置curl https请求需要提供 CA证书.客户端证书和客户端秘钥,这三个文件的pem格式. 分别对应 curl_easy_setopt() 函数的 下面三个参数: CURLOPT_CAINF ...

  8. 最简单的操作 jetty IDEA 【debug】热加载

    [博客园cnblogs笔者m-yb原创,转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708] http ...

  9. Oracle物化视图梳理

    --物化视图可以分为三种类型:* 包含聚集的物化视图* 只包含连接的物化视图* 嵌套物化视图三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大. --物化视图创建方式(Build M ...

  10. 第一篇,java学习之旅

    在java的这座殿堂中,我才刚刚推开了大门,就像是在岔路口找到了一条,走向前进java大门的路. 下面是一些java算法的问题 第一题: package project.model; import j ...