zoukankan      html  css  js  c++  java
  • Docker基本命令与使用 —— Dockerfile指令与构建(三)

    一.Dockerfile指令上

    1.指令格式

    # Comment 注释, 以#开头

    INSTRUCTION argument 以大写的指令+参数 

    #First Dockerfile 注释
    FROM ubuntu:14.04
    MAINTAINER dormancypress "dormancypress@outlook.com"
    RUN apt-get update
    RUN apt-get install -y nginx
    EXPOSE 80
     
    • From
    • MAINTAINER
    • RUN
    • EXPOSE 

    FROM指令

    FROM <image> / FROM <image>:<tag>
    • 已经存在的镜像
    • 基础镜像
    • 必须是第一条非注释指令
     

    MAINTAINER指令

    MAINTAINER <name>
    指定镜像的作者信息,包含镜像的所有者和联系信息
     

    RUN指令

    指定当前镜像中运行的命令,包含了两种命令模式
    • RUN<command> (shell模式)
    是以 /bin/sh -c command 形式执行命令
    eg. RUN echo hello
    • RUN ["executable", "param1", "param2" ] (exec模式)
    RUN ["/bin/bash", "-c", "echo hello"]
    镜像分层的概念,每一个run指令都会在当前镜像的上层创建一个新的镜像,来运行指定的命令
    RUN apt-get update && apt-get install -y nginx 将两条run指令合并成一条,会比原来的构建过程少了一步
     

    EXPOSE指令

    EXPOSE <port>[<port>...]
    指定运行该镜像的容器使用的端口,一个或多个,也可以在一个dockerfile中使用多个expose命令。但是在run一个容器时,还是必须指定容器的端口映射,如 docker run -p 80 -d test1 nginx。EXPOSE指令只是docker该容器内的应用程序会使用特定的端口,但出于安全的考虑,docker并不会自动的打开端口,而需要在使用时在run命令中添加对端口的映射。
     

    二.Dockerfile指令下

    • CMD 在容器运行时运行的命令
    • ENTERYPOINT
    • ADD 设置镜像的目录和文件
    • COPY
    • VOLUME
    • WORKDIR 镜像在构建及容器运行时的环境设置
    • ENV
    • USER
    • ONBUILD 类似触发器的指令
     

    CMD指令

    CMD指令用来提供容器默认运行的命令,与RUN类似,但是RUN是在镜像构建时运行的,而CMD指定的命令是在容器运行时运行的。并且当我们用docker run 命令启动一个容器时,如果指定了容器运行时的命令,那么CMD命令中的指令会被覆盖,不会执行。CMD指令是用来指定容器运行时的默认行为。
    • CMD [ "executable", "param1", "param2"] (exec模式)
    • CMD command param1 param2 (shell模式)
    • CMD [ "param1", "param2"] (作为ENTRYPOINT指令的默认参数)
     

    ENTRYPOINT指令

    ENTRYPOINT指令和CMD指令很相似,唯一的区别就是不会被docker run 命令中的指令所覆盖(run中的指令无效)。如需覆盖,可以使用docker run --entrypoint。
    • ENTRYPOINT [ "executable", "param1", "param2"] (exec模式)
    • ENTRYPOINT command param1 param2 (shell模式)
     

    ADD指令

    将文件和目录复制到使用docker构建的镜像中。文件或者目录的来源可以是本地路径,也可以是远程的URL。如果是本地地址必须是构建目录中的相对地址,对于远程URL,Docker不推荐使用,更建议使用curl和wget命令来获取文件。目标路径需要指定镜像中的绝对路径。
    • ADD <src>...<dest>
    • ADD ["<src>"..."<dest>"] (适用于文件路径中有空格的情况)
     

    COPY指令

    类似ADD指令。区别在于ADD包含类似tar的解压功能,如果单纯复制文件,docker推荐使用COPY。
    • COPY <src>...<dest>
    • COPY ["<src>"..."<dest>"] (适用于文件路径中有空格的情况)
    eg. COPY index.html /usr/share/nginx/html/
     

    VOLUME指令

    VOLUME指令用来向基于镜像创建的容器添加卷。这个目录可以绕过联合文件系统,并提供如共享数据或者对数据持久化的功能。
    • VOLUME ["/data"]
     

    WORKDIR指令

    用来在从镜像创建一个新容器时,在容器内部设置工作目录。ENTERYPOINT或者CMD指定的命令都会在这个目录下执行,我们也可以使用这个指令在构建中为后续的指令指定工作目录。
    • WORKDIR /path/to/workdir
    需要注意的是WORKDIR通常需要指定绝对路径,如果使用了相对路径,那么工作路径会一直传递下去。如
    WORKDIR /a
    WORKDIR b
    WORKDIR c
    RUN pwd
    OUT: /a/b/c
     

    ENV指令

    用来设置环境变量,与WORKDIR指令类似。环境变量的指令可以作用在构建过程中,以及在运行过程中同样有效。
    • ENV <key> <value>
    • ENV <key> <Value> ...
     

    USER指令

    用来指定镜像会以什么样的用户运行。
    • USER daemon
    eg. USER nginx 基于该镜像启用的容器,就会以nginx用户身份来运行。
    USER user USER uid
    USER user:group USER uid:gid
    USER user:gid USER uid:group
    如果不使用USER指令来指定用户,那么默认会使用root用户。
     

    ONBUILD指令

    ONBUILD指令能够为镜像添加触发器,当一个镜像被用作其他镜像的基础镜像时,这个触发器会被执行。当子镜像在构建时,会触发触发器中的指令。
    • ONBUILD [INSTRUCTION]
     

    三.Dockerfile构建过程

    • 从基础镜像运行一个容器
    • 执行一条指令,对容器做出修改
    • 执行类似docker commit的操作,提交一个新的镜像层
    • 再基于刚提交的镜像运行一个新容器
    • 执行Dockerfile中的下一条指令,直至所有指令执行完毕
     
    使用中间层镜像进行调试 —— 查找错误
    构建缓存
    不使用缓存
    • docker build --no-cache
    • Dockerfile 中的 ENV REFRESH_DATE 2015-04-01 之后变不再使用缓存
    查看镜像构建的过程
    • docker history [image]
  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/Hai--D/p/6991881.html
Copyright © 2011-2022 走看看