zoukankan      html  css  js  c++  java
  • 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文档

    一入运维深似海,从此不见彼岸花
  • 相关阅读:
    链接Oracle数据库
    Spring boot Mybatis
    Spring Boot 部署
    javaEE应用组件
    maven项目搭建步骤
    Spring Boot中Redis的使用
    Struts2 Hello,Wold
    使用JSON
    Spring中Quartz的配置
    Guice示例
  • 原文地址:https://www.cnblogs.com/cn-jasonho/p/13285571.html
Copyright © 2011-2022 走看看