Docker中Dockerfile的使用

实际环境中,项目所需要的容器可能没有很符合的公共镜像,就需要在公共镜像的基础上重新构建镜像,除了可以从容器中用docker commit命令创建,还可以使用Dockerfile文件来直接定制镜像

1、使用Dockerfile定制镜像

  • 举例定制一个简单的镜像,新建一个名为Dockerfile的文件,并在文件内添加以下内容:

    FROM nginx
    MAINTAINER cuckoo
    
    RUN echo '这是一个本地构建的test镜像' > /usr/share/nginx/html/index.html
    
  • 基础说明
    FROM:定制的镜像基本基于公共镜像的基础上,这里就是用FROM来下载公共镜像nginx,后续的操作就是在这个镜像的基础上进行修改
    RUN:用于执行后面的命令,常用的有两种:一个就是直接接shell命令,另一个是接可执行文件,可包含参数传递,如RUN ./test.py parameter1 paramter2

    [NOTE]
    Dockerfile的指令每执行一次都会在docker上新建一层,所以过多的命令就会有过多的无意义的层,容易造成镜像膨胀过大,在写法上可以进行优化,如下这样以&&符号链接命令,这样执行后,只会创建一层镜像。

    FROM centos
    RUN yum install wget
    RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
    RUN tar -xvf redis.tar.gz
    以上执行会创建 3 层镜像。可简化为以下格式:
    FROM centos
    RUN yum install wget \
        && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
        && tar -xvf redis.tar.gz
    
  • 开始构建
    在Dockerfile所有的目录执行docker build -t nginx:v1,即构建一个nginx:v1的镜像

    [NOTE]
    实际上更多的是配合docker-compose.yml一起使用~

2、常用命令说明

  • COPY,复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
    格式:
    COPY [--chown=<user>:<group>] <源路径1>... <目标路径>

    [NOTE]
    [--chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。
    <源路径>:源文件或者源目录。
    <目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

  • ADD
    和COPY的使用格式一致(同样需求下,官方推荐使用 COPY),在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。具体是否使用,可以根据是否需要自动解压来决定。

  • CMD
    为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。类似于 RUN 指令,但二者运行的时间点不同:

    • CMD 在docker run 时运行。
    • RUN 是在 docker build。

    格式:
    CMD <shell 命令>
    CMD ["<可执行文件或命令>","<param1>","<param2>",...]
    CMD ["<param1>","<param2>",...]
    推荐使用第二种格式,执行过程比较明确。

    [NOTE]
    更多的情况是关于容器运行时的命令会写在docker-compose.yml,Dockerfile就用来执行build需要的命令,与CMD指令类似的还有ENTRYPOINT指令。

  • ENV
    设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
    格式:
    ENV <key> <value>
    ENV <key1>=<value1> <key2>=<value2>...
    如:ENV JAVA_HOME /usr/java/jdk1.8.0_202-amd64

  • WORKDIR
    指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在,WORKDIR 指定的工作目录,必须是提前创建好的。
    格式:
    WORKDIR <工作目录路径>

  • USER
    用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户,用户和用户组必须提前已经存在。
    格式:
    USER <用户名>[:<用户组>]

posted @ 2020-10-28 14:48  灬夜露沁心灬  阅读(251)  评论(0编辑  收藏  举报