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

作者:NealLemon
链接:https://www.jianshu.com/p/726ebafb015d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Dockerfile语法梳理的更多相关文章

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

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

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

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

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

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

  4. 四:(之九_容器资源限制)Dockerfile语法梳理和实践

    9 容器资源限制 9.1 Virtualbox :工具操作 9.2 内存限制 docker --help  只限定memory bytes,则memory-swap默认与其存储相同. 资源限制生效: ...

  5. 四:(之七_如何与运行中容器交互)Dockerfile语法梳理和实践

    1.指定网络连接方式:--net=””   (bridge/host/none/container: 四种类型) 注:192.168.33.18 此IP是在vagrantfile中指定的虚拟机IP:c ...

  6. Golang 基础之基础语法梳理 (三)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第三章节 Golang 基础之基础语法梳理 (一) Gol ...

  7. Golang 基础之基础语法梳理 (一)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第一章节 Golang 基础之基础语法梳理 (一) Gol ...

  8. Golang 基础之基础语法梳理 (二)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第二章节 Golang 基础之基础语法梳理 (一) Gol ...

  9. dockerfile语法

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

随机推荐

  1. Ubuntu设置终端操作行为的回收站

    Ubuntu设置终端操作行为的回收站(默认情况下,在终端删除文件,会直接删除) 参考自:https://help.aliyun.com/knowledge_detail/41359.html?spm= ...

  2. 珠峰培训node正式课--【笔记】|全局对象 | process | util | fs | stream 流

    全局对象: console  : __filename     ; __dirname     ; setTimeOut     ; setImmediate(把参数函数放在下一个环节执行) proc ...

  3. css实现input文本框的双边框美化

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  4. jQuery--data()方法

    data() 函数用于在当前jQuery对象所匹配的所有元素上存取数据. 通过data()函数存取的数据都是临时数据,一旦页面刷新,之前存放的数据都将不复存在. 该函数属于jQuery对象(实例).如 ...

  5. Tomcat不能访问ln -s软连接文件夹的前因后果

    为了部署方便,把webapps下的大文件(图片等资源)放到工程外,通过软连接的方式设置 命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件. ln -s /usr/local/pic/i ...

  6. 《dream》

    <dream- 梦想> I don't know what that dream is that you have, I don't care how disappointing it m ...

  7. nginx之动静分离(nginx与php不在同一台服务器)

    nginx实现动静分离(nginx与php不在同一个服务器) 使用wordpress-5.0.3-zh_CN.tar.gz做实验 Nginx服务器的配置: [root@app ~]# tar xf w ...

  8. Java动态调用脚本语言Groovy

    Java动态调用脚本语言Groovy 2019-05-15 目录 0. pom.xml添加依赖1. 使用GroovyShell计算表达式2. 使用GroovyScriptEngine脚本引擎加载Gro ...

  9. 一种Winform类electron的实现

    最近看了一篇文章  Winform客户端内嵌Vue页面  使用html作为winform的界面(其实这种做法早在MFC时代就已经有了),不过感觉文章中的封装并不够彻底,所以我忍不住要发一篇博客来说说我 ...

  10. java实现开根号的运算

    面试的时候,偶然被问到,开根号的实现,虽然给面试官讲解了思路,但是没有实际实现过,今天闲来无事,就把自己的思路写一下,做个笔记. 如果某个数字正好可以开根号为2个整数,例如1,4,9等,那就很简单了. ...