在Dockerfile中定义了很多关键字,通过关键字来完成Dockerfile的编写。

  Dockerfile官方文档

9.1 FROM

  在Dockerfile中FROM主要是指定这个Dockerfile基于哪一个base image构建。Docker Dockerfile按顺序运行指令。一个Dockerfile 必须用FROM指令启动,放在第一行。

FROM scratch        # 制作base image
FROM centos         # 使用base image
FROM ubuntu:14.04   # 使用指定版本的base image

安全起见,尽量使用官方的image作为base image。

9.2 LABEL

  在Dockerfile中LABEL实际上是英译了Metadata,就像是代码中的注释。主要包含了该镜像的作者、版本和描述信息。

LABEL maintainer="staryjie@163.com"
LABEL version="1.0"
LABEL description="This is description"

Metadata不可少!

9.3 RUN

  在Dockerfile中RUN用来运行命令,其中命令必须是在第一行FROM中指定的base image所能运行的。每运行一次RUN,构建的image都会生成新的一层layer。

RUN yum update && yum install -y vim \
python-dev # 反斜杠换行
RUN apt-get update && apt-get install -y perl \
pwgen --no-install-recommends && rm -rf \
/var/lib/apt/lists/* # 注意清理cache
RUN /bin/bash -C 'source $HOME/.bashrc;echo $HOME'

为了美观,复杂的RUN可以使用反斜杠换行。

为了避免无用分层,多条命令尽量合并一行。

9.4 WORKDIR

  在Dockerfile中WORKDIR用来设定当前工作目录,类似Linux系统中的cd命令。

WORKDIR /root
WORKDIR /test        # 如果没有该目录,则会自动创建
WORKDIR demo
RUN pwd # 输出的结果应该是/test/demo

用WORKDIR,不要使用RUN cd !!!

为了避免出错,尽量使用绝对路径。

9.4 ADD和COPY

  在Dockerfile中ADD和COPY作用相似,都是把本地的文件添加到docker image中。区别:ADD不仅可以添加文件,还可以解压缩文件,COPY不可以解压缩文件。

ADD hello /
ADD test.tar.gz /        # 添加到image的根目录并且解压
WORKDIR /root
ADD hello test/ # 将hello添加到image的/root/test/hello
WORKDIR /root
COPY hello test/ # 跟上面的效果一样

大部分情况下COPY优于ADD。

ADD除了COPY还有额外功能(解压)。

添加远程文件/目录,请使用curl或者wget。

9.5 ENV

  在Dockerfile中ENV来设置环境变量或者一些常量。可以在ENV设置的常量后面直接使用。

ENV MYSQL_VERSION 5.6        # 设置常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \
&& rm -rf /var/lib/apt/lists/* #引用常量

尽量使用ENV增加可维护性!

9.6 VOLUME

  在Dockerfile中VOLUME用于向基于镜像创建的容器添加卷,一个卷可以存在于一个或多个容器的特定目录,这个目录可以绕过联合文件系统,并提供共享数据、数据持久化的功能。

VOLUME ["/data"]

9.7 EXPOSE

  在Dockerfile中EXPOSE设置容器暴露的端口,可以指定一个或多个端口。

EXPOSE 80

虽然在EXPOSE指令中已经暴露了指定的端口,但是在启动容器的时候还是要指定端口信息,容器本身不会自动暴露端口。

9.8 CMD

  在Dockerfile中CMD设置容器启动后默认执行的命令和参数。如果定义了多个CMD,只会执行最后一个。

CMD ["executable","param1","param2"]        # 执行形式,这是首选形式
CMD ["param1","param2"]                     # 作为进入点的默认参数
CMD command param1 param2                   # 壳形式

不要定义多个CMD,多个CMD只有最后一个会执行。

9.9 ENTRYPOINT

  在Dockerfile中ENTRYPOINT设置容器启动时运行的命令,可以让容器以应用程序或者服务器的形式运行,而且ENTRYPOINT设定的命令不会被忽略,一定会执行。

COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

可以写一个shell脚本作为ENTRYPOINT的入口。

RUN、CMD、ENTRYPOINT对比

  • RUN 执行命令并创建新的image layer
  • CMD 设置容器启动后默认执行的命令和参数
  • ENTRYPOINT 设置容器启动时运行的命令

shell格式和exec格式

  • shell格式
RUN apt-get install -y vim
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"

  Dockerfile

FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"

  构建镜像:

docker build -t staryjie/centos-entrypoint-shell .

  运行容器:

docker run staryjie/centos-entrypoint-shell

hello Docker
  • exec格式
RUN ["apt-get","install","-y","vim"]
CMD ["/bin/echo","hello docker"]
ENTRYPOINT ["/bin/echo","hello docker"]

  Dockerfile

FROM centos
ENV name Docker
ENTRYPOINT ["/bin/echo","hello $name"]

  构建镜像:

docker build -t staryjie/centos-entrypoint-exec .

  运行容器:

docker run staryjie/centos-entrypoint-exec

hello $name

  改写Dockerfile

FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash","-c","echo hello $name"]

  构建镜像:

docker build -t staryjie/centos-entrypoint-exec-new .

  运行容器:

docker run staryjie/centos-entrypoint-exec-new

hello Docker
  1. CMD

    • 容器启动时默认执行的命令
    • 如果docker run指定了其他命令,CMD命令会被忽略
    • 如果定义了多个CMD,只有最后一个会执行
  2. ENTRYPOINT
    • 让容器以应用程序或者服务的形式运行
    • 不会被忽略,一定会执行

9、Dockerfile语法的更多相关文章

  1. 四:(之五)Dockerfile语法梳理和实践

    *5.Dockerfile语法梳理和实践 5.1 尽量使用官方的image作为base image 5.2 metadata:指明作者 版本 描述 5.3 每一条run都能形成一个分层,避免无用分层应 ...

  2. Dockerfile语法梳理

    Dockerfile语法 我们先来看一下上篇的 Dockerfile #获取base image FROM adoptopenjdk/openjdk8:latest #类似于执行 linux指令 RU ...

  3. dockerfile语法

    dockerfiles的指令不区分大小写,但约定为全部大写 dockerfiles支持如下语法命令: 1.FROM <image name> 所有的dockerfile都必须以from命令 ...

  4. dockerfile 语法

    基本语法格式:INSTRUCTION arguments (指令+参数)不分大小写 注释格式:# 注释 第一个指令必须是FROM,标示使用什么镜像 1.解析器指令 解析器指令是可选的,并且影响处理Do ...

  5. Dockerfile语法简介

    Dockerfile是由一系列命令和参数构成的脚本,一个Dockerfile里面包含了构建整个image的完整命令.Docker通过docker build执行Dockerfile中的一系列命令自动构 ...

  6. DockerFile语法【h】

    DockerFile在我理解就是可以将所需要构建镜像的功能.组件都天前配置好,然后直接生成一个Image,而不是先生成镜像,再通过修改容器的方法来生成最终需要的镜像.   镜像的定值实际上就是定值每一 ...

  7. 一文学会Dockerfile语法

    接应上篇,续讲前文.今天咱来聊一下Dockerfile的使用 . 虽然可以通过docker commit命令来手动创建镜像,但是通过Dockerfile文件,可以帮助我们自动创建镜像,并且能够自定义创 ...

  8. dockerfile语法规则

    编写Dockerfile 在前面的章节,我们学习了通过docker命令来下载镜像,运行镜像,在容器中部署自己的程序,最后将容器提交到自己的镜像中.但是,这并不是Docker推荐的镜像构建方式.在这一章 ...

  9. 四:(之八_Linux压力测试工具stress)Dockerfile语法梳理和实践

    8.1 安装stress stress目前是在该目录下的可执行文件 --vm 创建几个进程 --vm-bytes 为每个进程分配多少内存 8.2 debug输出stress创建进程的过程 一直在创建有 ...

  10. 四:(之六_镜像发布)Dockerfile语法梳理和实践

    *6.镜像发布 1>注册Docker Hub账号并登陆. build的镜像名称格式必须是: dockerhub账户名/标识: 使用docker login在项目目录下登录: 浏览器: 2> ...

随机推荐

  1. oracle数据库死锁的查看及解决

    Oracle常见死锁发生的原因以及解决方法 www.MyException.Cn  网友分享于:2014-09-02  浏览:0次       Oracle常见死锁发生的原因以及解决办法 一,删除和更 ...

  2. 管道和FIFO 二

    前面我们学习了一下进程,我们知道多,进程间的地址空间相对独立.进程与进程间不能像线程间通过全局变量通信. 如果想进程间通信,就需要其他机制.          常用的进程间通信方式有这几种   A.传 ...

  3. mamp下安装ruby的mysql库

    mysql2库死活不行,用ruby-mysql得了,纯ruby的库 gem "ruby-mysql" require 'mysql'

  4. Envoy 源码分析--程序启动过程

    目录 Envoy 源码分析--程序启动过程 初始化 main 入口 MainCommon 初始化 服务 InstanceImpl 初始化 启动 main 启动入口 服务启动流程 LDS 服务启动流程 ...

  5. Linux C 一些函数 所属的头文件

    在编写程序时,有时总是不记得所使用的函数在哪个库函数中.现在先把自己以前经常用到的函数头文件总结一下. 有不对的地方还请指教. 1,系统调用文件的操作函数 #inlclude <fcntl.h& ...

  6. 用Tensorflow搭建网络

    层 创建层 创建密集连接层,并应用激活函数 x = tf.placeholder(tf.float32, shape=[None, 3]) linear_model = tf.layers.Dense ...

  7. Solr -- 查询语法/参数

    1. 常用查询参数 参数 描述 defType 指定用于处理查询语句(参数q的内容)的查询解析器,eg:defType=lucene sort 指定响应的排序方式:升序asc或降序desc.同时需要指 ...

  8. linux centos 6.1 安装 redis

    1, yum install redis 检测是否有redis 2,没有的话就运行:yum install epel-release 3,再执行 yum install redis

  9. Django之路 - 实现登录随机验证码

    登录验证码是每个网站登录时的基本标配,网上也有很多相应的文章, 但是从生成验证码到 应用到自己的网站上的全步骤,并没有看到很多, 为了节约大家的时间,我把整体步骤写下来, 即拿即用哈 1. 生成随机验 ...

  10. 使用通配符配置action

    建立struts2wildcard项目,此实例基本仿照前面前面第7点的实例改写而成.为了使用通配符,只需要改写配置文件即可.此实例未使用通配时的配置文件如下: <action name=&quo ...