Dockerfile语法梳理

在上一篇 使用Docker部署第一个Springboot应用 中我们使用了Dockerfile来创建镜像,接下来让我们来进一步的了解一下Dockerfile的语法。

Dockerfile语法

我们先来看一下上篇的 Dockerfile

#获取base image
FROM adoptopenjdk/openjdk8:latest 
#类似于执行 linux指令
RUN mkdir /opt/app  
#类似于linux copy指令
COPY demo-docker.jar /opt/app/       
#对外端口
EXPOSE 8080
#执行命令 java -jar /opt/app/demo-docker.jar
CMD ["java", "-jar", "/opt/app/demo-docker.jar"]

我们可以看到 简单的几行命令就可以使用docker自动的部署我们自己的项目。接下来让我们来仔细的了解一下每个命令。

FROM

一般是Dockfile开头的语法,他的作用是指定我们所新创建的docker image的base image,比如

 FROM scratch             # 表示我们从头去创建image 不依赖于base image
 FROM adoptopenjdk/openjdk8:latest  # 表示从某个base image之上创建image

我们可能好奇,adoptopenjdk/openjdk8:latest这段代码的含义是什么,其实这个是我调用了 docker hub上已经有人发布的镜像,不需要自己去配置JDK的环境。类似于github,我们可以在牛人已经实现的代码仓库中下载所需要的代码。在这里我们顺便介绍一下 docker hub的简单使用,因为是新手,所以不会去创建docker hub的镜像,我们只去查询和拉取已经成熟发布的镜像资源。

首先我们打开 docker hub (由于国内网络问题,可能需要翻墙)。

dockerhub.png

像也就是jdk8

dockerhub2.png

然后我们点击后,就可以查看到该镜像的具体细节。

dockerhub3.png

如果我们一开始不知道如何使用的话,我们可以将网页向下拉,找到具体介绍如何使用该镜像的文档。

dockerhub4.png

这样 按照文档上的来,我们就可以以 所查询的镜像作为base image ,在此环境上继续创建镜像。

当然我们也可以使用Dockerfile命令自己创建属于自己的base image 。这个就是在熟练使用之后的操作了。

LABEL

给创建的镜像添加标签,比如作者信息,版本信息,描述信息等。

LABEL maintainer = "作者姓名"

LABEL version = "1.0"

LABEL description = "描述"

其实LABEL 比较像我们写代码时候的注释,在创建镜像是应该是必不可少的。

RUN

相当于执行命令,比如我们需要在镜像中安装一些软件,那么就需要使用RUN语法,但是需要注意的是,由于每条RUN操作会在docker之中新建一个镜像,所以我们尽量将一些命令合并成一条,在这里我们可以使用反斜杠换行,使其阅读美观。

RUN yum update && \
    yum install -y vim 

WORKDIR

类似于linux下的 cd 命令

WORKDIR /test   #如果没有会自动创建test目录
WORKDIR demo    #同上
RUN pwd       # 输出 /test/demo

在对目录进行操作时,我们需要注意

  • 尽量使用WORKDIR 不要使用 RUN cd
  • 尽量使用绝对路径

ADD 和 COPY

ADD COPY
相同功能 将某文件复制到固定目录下 将某文件复制到固定目录下
不同功能 可以将tar文件解压提取到固定目录下 单纯复制文件
举例 ADD test / ADD test.tar.gz / COPY test /

注意: 如果想添加远程文件、目录,请使用 RUN + curl/weget

ENV

为当前容器设置环境变量时,我们可以使用ENV设置一个常量,比如我们想安装一个5.7的MYSQL 我们可以这么做

ENV MYSQL_VERSION 5.7   # 设置常量 MYSQL_VERSION  值是 5.7
RUN apt-get install -y mysql-server = “${MYSQL_VERSION}”  #引用常量

CMD和ENTRYPOINT

在介绍之前,我们要知道两种书写Dockfile命令行的格式,前提是大家要熟悉linux下的基本命令

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

我们来看一段命令

Dockerfile1:

FROM centos
ENV name hello-Docker
ENTRYPOINT echo "${name}" # 输出是 hello-world 

Dockerfile2

FROM centos
ENV name hello-Docker
ENTRYPOINT ["bin/echo","${name}"]  # 输出是 ${name}

出现两种不同输出的原因是因为 我们第一个Dockerfile 是shell格式执行命令时,默认就是 在linux的shell里执行。

但是第二个Dockerfile 我们使用的是Exec格式,我们去执行的是 echo这个命令而不是在linux的shell下执行命令,因此输出不一样。

CMD
  • 容器启动时默认执行的命令

  • 如果docker run 指定了其他命令,CMD命令被忽略

    • 比如 执行这段Dockerfile

      FROM centos
      CMD echo "hello docker"
      

      docker run [image] 输出就是 hello docker

      docker run [image] /bin/bash 默认进入了当前container

  • 如果定义了多个CMD,只有最后一个CMD会被执行。

ENTRYPOINT
  • 让容易以应用程序或者服务的形式运行
  • 不会被忽略,一定会执行
  • 最佳实践:写一个shell 脚本作为 ENTRYPOINT

EXPOSE

功能为暴漏容器运行时的监听端口给外部

但是EXPOSE并不会使容器访问主机的端口

如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数

VOLUME

可实现挂载功能,容器告诉Docker在主机上创建一个目录(默认情况下是在/var/lib/docker),然后将其挂载到指定的路径。当删除使用该Volume的容器时,Volume本身不会受到影响,它可以一直存在下去。

比如

FROM centos
#将该镜像的存储内容挂载到test文件夹下。这样即使删除了该镜像,再重新创建后,也不会影响数据
VOLUME /test  
CMD echo "hello docker"

总结

只是列出了基本常用的命令,其他特殊的命令可以查看相关文档 docker Dos

dockerDocs.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容