Dockerfile    第4关:ENV、EXPOSE、WORKDIR、ARG指令

任务描述

本关的任务是学习ENV、EXPOSE、WORKDIR、ARG四个指令,要求学习者参照示例,使用Dockerfile构建一个名为testimage:v1的镜像,Dockerfile的内容为:以busybox:latest作为基础镜像,声明暴露3000端口。将变量var1="test"设置为环境变量,同时设置工作目录为/tmp,在工作目录下创建一个1.txt文件。

相关知识

这一关我们继续介绍Dockerfile的指令,本关将介绍ENVEXPOSEWORKDIRARG

WORKDIR指令

●WORKDIR为其他指令设置工作目录
格式:
WORKDIR <工作目录路径>

WORKDIR指令为Dockerfile中的任何RUNCMDENTRYPOINTCOPYADD指令设置工作目录(或称当前目录)。(也就是说以后各层的当前目录就被改为WORKDIR指定的目录)如果WORKDIR对应的目录不存在,将会自动被创建。

ENV指令

●ENV 设置环境变量
格式: 
ENV <key> <value>ENV <key>=<value>

这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,还是运行时的应用,都可以直接使用这里定义的环境变量。如下所示,下面是为tomcat设置环境变量并让tomcat自启动的一个Dockerfile片段。ENV设置的环境变量CATALINA_HOME能够被后续定义指令使用。

  1. ENV CATALINA_HOME /var/tmp/apache-tomcat-8.0.45
  2. ENV PATH $PATH: $CATALINA_HOME/bin
  3. ENTRYPOINT $CATALINA_HOME /bin/startup.sh && /bin/bash

    ARG指令

    ●ARG 构建参数
    格式: 
    ARG <参数名>[=<默认值>]

    ARGENV有些类似,它们都可以被后面的其它指令直接使用,但是它并不是环境变量,这意味着将来容器运行时是不会存在ARG变量的。

    Dockerfile 中的ARG指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令docker build 中用 --build-arg <参数名>=<> 来覆盖。

    什么时候用ARG,什么时候用ENV?
    如果想保存为环境变量,就用
    ENV;如果只想在Dockerfile中临时使用,就用ARG

    EXPOSE指令

    ●EXPOSE 暴露端口
    格式:
    EXPOSE <端口1> [<端口2>...]

    EXPOSE指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。如果想要公开容器的端口,必须在docker run是指定-p参数去公开端口或者指定-P参数公开所有被EXPOSE的端口。具体可以参照https://docs.docker.com/engine/reference/run/#expose-incoming-ports

    在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P时,会自动随机映射EXPOSE 的端口。

    实例:使用Dockerfile,创建一个拥有java和tomcat运行环境的镜像。

    Dockerfile的内容如下,首先使用FROM指定基础镜像为ubuntu:latest镜像。然后使用WORKDIR设置当前的工作目录为/var/tmp。接下来使用RUN命令将jre.tar.gz下载到工作目录,并解压文件,然后删除jre.tar.gz;然后用类似的方式处理tomcat

    接下来使用ENV配置javatomcat的环境变量,由于tomcat服务会默认监听8080端口,所以使用EXPOSE暴露端口号。最后使用ENTRYPOINT设置启动命令,使tomcat服务随容器启动而启动。

  4. FROM ubuntu
  5. WORKDIR /var/tmp
  6.  
  7. RUN apt-get update && \
  8. apt-get install -y wget && \
  9. wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jre-8u144-linux-x64.tar.gz && \
  10. tar -xzf jre-8u144-linux-x64.tar.gz && \
  11. rm jre-8u144-linux-x64.tar.gz
  12.  
  13. RUN wget "http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.0.45/bin/apache-tomcat-8.0.45.tar.gz" && \
  14. tar -xzf apache-tomcat-8.0.45.tar.gz && \
  15. rm apache-tomcat-8.0.45.tar.gz
  16.  
  17. ENV JAVA_HOME /var/tmp/jre1.8.0_144
  18. ENV CATALINA_HOME /var/tmp/apache-tomcat-8.0.45
  19. ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
  20.  
  21. EXPOSE 8080
  22.  
  23. ENTRYPOINT /var/tmp/apache-tomcat-8.0.45/bin/startup.sh && /bin/bash

    任务要求

    本关的编程任务是补全step4/dockerfile4.sh文件中的内容,要求使用Dockerfile构建一个名为testimage:v1的镜像,具体要求如下:

  • 补全Dockerfile文件,该Dockerfile的内容如下:
  • 以busybox:latest作为基础镜像,
  • 声明暴露3000端口
  • 将变量var1="test"设置为环境变量
  • 设置工作目录为/tmp,在工作目录下创建一个1.txt文件。
  • 基于该Dockerfile文件,构建一个名为testimage:v1的镜像

    #创建一个空文件夹,并进入其中

    mkdir newdir4

    cd newdir4

    #创建一个Dockerfile文件

    touch Dockerfile

    #假设我的Dockerfile文件为

    #FROM ubuntu

    #RUN mkdir dir1

    #可以这么写:

    # echo 'FROM ubuntu' > Dockerfile

    # echo 'RUN mkdir dir1'>> Dockerfile

    #输入Dockerfile文件内容

    #********** Begin *********#

    #以busybox为基础镜像

    echo 'FROM busybox:latest' > Dockerfile

    #声明暴露3000端口

    echo 'EXPOSE 3000'>> Dockerfile

    #将变量var1=test设置为环境变量

    echo 'ENV var1=test' >> Dockerfile

    #设置工作目录为/tmp

    echo 'WORKDIR /tmp' >> Dockerfile

    #在工作目录下创建一个1.txt文件

    echo "RUN touch 1.txt" >> Dockerfile

    #********** End **********#

    #文件内容完毕,在当前文件夹中执行

    #********** Begin *********#

    #以该Dockerfile构建一个名为testimage:v1的镜像

    docker build -t testimage:v1 .

     

    #********** End **********#

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐