当前位置: 代码迷 >> 综合 >> docker(2) : Dockerfile 基本知识点。
  详细解决方案

docker(2) : Dockerfile 基本知识点。

热度:101   发布时间:2023-10-24 16:46:10.0
        1.概述: Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。2.Dockerfile的结构:一般来说,Dockerfile可分为如下4个部分:基础镜像信息维护者信息镜像操作指令容器启动时执行指令   3.编写Dockerfile时的步骤:step1 :一开始必须指明所基于的镜像名称。step2 :接下来一般是说明维护者的信息。step3 :接着是镜像操作指令,如RUN指令,RUN指令将对镜像执行跟随的命令,每运行一条RUN指令镜像就添加                       新的一层并提交。step4 :最后是CMD指令,用来指定运行容器时的操作指令。 4.指令说明:4.1、FROM : 指定所创建镜像的基础镜像,如果本地不存在,则会默认去Docker Hub下载指定镜像。格式为 :FROM imageName:tagFROM imageNameFROM imageName@digest     bs:digest 为镜像的sha256sum值。exp1 :FROM buildpack-deps:jessie-scmexp2 :FROM nginxexp3 :FROM nginx@a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e64.2、MAINTAINER : 指定维护者信息。格式为 :MAINTAINER 维护者信息(bs:此维护者信息会写入生成镜像的Author属性域中)exp1 :  MAINTAINER wzy_create@188178xxxx@163.com4.3、RUN : 运行指定命令,在镜像生成过程中执行。格式为 :RUN commandRUN ["executable" , "param1" , "param2" , ...............]exp1 : RUN yum install iproute nginx && yum clean all 当命令较长的时候可以使用 \ 号来换行exp2 :   RUN apt-get update \&& apt-get install -y libsnappy-dev zlib1g-dev libbz2-dev \&& rm -rf /var/cache/aptexp3 :   RUN["bin/bash", "-c", "echo hello"]4.4、CMD : 用来指定容器启动的时候默认执行的命令。格式 :CMD["executable", "param1", "param2",.......]     #使用exec执行,推荐。CMD param1 param2                                       #在/bin/sh中执行,提供给需要交互的应用。CMD["param1", "param2",.....]                           #提供给ENTRYPOINT的默认参数。注意点 :Dockerfile只能有一条CMD命令,如果指定了多条只有最后一条会被执行。4.5、LABEL : 用来指定生成镜像的元数据标签信息。格式 :LABEL key=value key=value key=value ..........exp1 :  LABEL version="1.0" descript="update log style"4.6、EXPOSE : 声明镜像内服务监听的端口。格式 :EXPOSE port port port .........exp1 :  EXPOSE 8080 80 8443 443注意点 :EXPOSE只是起到申明作用,并不会自动完成端口映射,启动容器的时候还是需要使用-p指定端口映射,-P则会随机指定端口映射。(随机指定宿主机端口与镜像服务监听端口映射)4.7、ENV : 指定环境变量,在镜像生成过程中会被后续的RUN指令使用,在镜像启动的容器中也会存在。格式 :ENV key=value key=valueENV key value (只能一对,想要定义多个,再定义ENV key value)。exp1 :ENV PG_MAJOR=9.3 PG_VERSION=9.3.4exp2 :  ENV PG_MAJOR 9.3 ENV PG_VERSION 9.3.4注意点 :指令指定的环境变量在容器运行时可以被覆盖,如docker run --env PG_MAJOR=9.4 则容器内的此环境就是9.4。4.8、ADD : 将复制指定的路劲下的内容到容器内的目标路径。格式 :ADD src dest    #src 可以是此Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个url , 还可以是一个tar文件(如果是tar文件,会自动解压到dest路径下)。#dest可以是容器内的绝对路径,或者相对于工作目录WORKDIR的相对路径。(路径支持正则表达式)。exp1 : ADD  *.java  /code/      #将当前目录下的所有java文件复制到容器工作目录相对路为/code/的目录下。4.9、COPY : 将复制指定的路劲下的内容到容器内的目标路径。跟ADD差不多,推荐使用COPY。格式 :COPY src dest#src 可以是此Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个url , 还可以是一个tar文件(如果是tar文件,会自动解压到dest路径下)。#dest可以是容器内的绝对路径,或者相对于工作目录WORKDIR的相对路径,目标路径不存在时会自动创建                                                          (路径支持正则表达式)。 4.10、ENTRYPOINT : 指定镜像的默认入口命令,该入口命令会在容器启动时作为根命令执行,所有传入值作为该命令的参数,跟CMD相似但是会在CMD前面执行。格式 : 跟CMD一致。注意点 :Dockerfile 中只能有一个ENTRYPOINT ,指定多个的时候只会执行最后一个。在运行的时候可以使用--entrypoint 覆盖此命令值。4.11、VOLUME : 创建一个数据卷挂载点。格式 :VOLUME["/test"]。4.12、USER : 指定运行容器时的用户名或UID,后续的RUN指令也会使用指定用户身份。格式为 :USER username用法 :当服务不需要使用管理员权限时,可以使用该命令指定运行用户,但是在之前创建此用户。如: RUN groupadd -r postgres && useradd -r -g postgres postgresUser1。4.13、WORKDIR : 指定镜像的工作目录,为后续的RUN\CMD\ENTRYPOINT指令配置工作目录。格式 :WORKDIR /path注意点 :可以使用多个WORKDIR指令,但是后续的命令都是参数则是前面路径的相对路径,如:WORKDIR /aWORKDIR bWORKDIR c最终的工作目录为 /a/b/c4.14、ARG : 指定一些镜像内使用的参数(如版本号等),这些参数在执行docker build 命令的时候才会以--build-arg argname=value 格式传入。格式 :ARG argName1[=value1] argName2[=value2]4.15、ONBUILD : 配置当所创建的镜像作为其他镜像的基础镜像时,所执行的操作指令。格式为 :ONBUILD 指令内容。exp1 :ONBUILD  ADD .java   /app/srcexp2 :ONBUILD  RUN rm -rf *bs:如果我们的使用Dockerfile DA 构建了镜像A,而DA中有exp1跟exp2两条指令,而这时我们使用DA作为Dockerfile DB的基础镜像(就是FROM DA),这个时候就相当于在DB中会是如下结果FROM DBADD .java  /app/srcRUN rm -rf *        (注意三天语句一定是跟随的,中间不会有其他语句)。4.16、STOPSIGNAL : 指定所创建的的镜像启动的容器接收退出的信号值。exp1 : STOPSIGNAL stopexp2 : STOPSIGNAL shirt_down5、创建镜像:docker build ,该命令将读取指定路径下(包括子目录)的Dockerfile文件,并将路径下的所有内容发送给docker服务器, 由服务器来创建镜像。-f 指定路径,不使用的话默认读取当前目录下(包括子目录)的Dockerfile文件。-t 指定镜像名称