DockerFile 语法

DockerFile示例展示:

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

FROM

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

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

LABEL

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

LABEL maintainer = "作者姓名"
LABEL version = "版本信息"
LABEL description = "描述"

RUN

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

RUN yum -y update && \
    yum install -y net-tools ntpdate && \
    mkdir -p /opt/nginx/{html,conf}

WORKDIR

类似于linux中的 cd 命令,在对目录进行操作时,需要注意

  • 尽量使用WORKDIR 不要使用 RUN cd
  • 尽量使用绝对路径
WORKDIR /opt/software      //如果没有会自动创建/opt/software目录
WORKDIR apps               //同上
RUN pwd                    //输出内容是/opt/software/apps

ADD 和 COPY

 ADDCOPY
相同功能 将某文件复制到固定目录下 将某文件复制到固定目录下
不通功能 可以将tar文件解压提取到固定目录下 单纯复制文件
示例

ADD demo /opt

ADD demo.tar.gz /opt

COPY demo /opt

 

 

 

 

 

 

 

 

 

 

如果想添加远程文件、目录,可使用 RUN + curl/wget

ENV

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

ENV MYSQL_VERSION 5.7                                  //设置常量 MYSQL_VERSION值是5.7
RUN yum install -y mysql-server = "${MYSQL_VERSION}"   //引用常量

CMD 和 ENTRYPOINT

dockerfile有两种书写格式,cmd和entrypoint在这两种书写格式中输出的结果不通

  • 第一种shell格式:
RUN yum install -y ntpdate
CMD echo "hello world"
ENTRYPOINT echo "hello world"
FROM centos7
ENV name hello-world
ENTRYPOINT echo "${name}"  //输出是hello-world 
  • 第二种exec格式:
RUN ["yum","install","-y","ntpdate"]
CMD ["/bin/echo","hello-world"]
ENTRYPOINT ["/bin/echo","hello-world"]
FROM centos7
ENV name hello-world
ENTRYPOINT ["bin/echo","${name}"]  //输出是${name}

两种不同输出的原因是因为第一种Dockerfile是shell格式执行命令,默认就在linux的shell里执行。第二种Dockerfile我们去执行的是 echo这个命令而不是在linux的shell下执行命令,因此输出不一样。

1)CMD

容器启动时默认执行的命令,如果docker run指定了其他命令,CMD命令被忽略,例如:

FROM centos7
CMD echo "hello-world"

docker run [image] 输出就是 hello-world

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

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

2)ENTRYPOINT

让容器以应用程序或者服务的形式运行

不会被忽略,一定会执行

最佳实践是写一个shell 脚本作为 ENTRYPOINT

EXPOSE

功能为暴漏容器运行时的监听端口给外部
但是EXPOSE并不会使容器访问主机的端口
如果想使容器与主机的端口有映射关系,必须在容器启动的时候加上 -P 参数

VOLUME

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

FROM centos7    //将该镜像的存储内容挂载到宿主机data文件夹下,这样即使删除了该镜像,再重新创建后,也不会影响数据
VOLUME /data
CMD echo "hello-world"

Dockerfile更多语法请参考docker doc文档

posted @ 2020-01-07 22:02  不倒翁Jason  阅读(278)  评论(0编辑  收藏  举报