zoukankan      html  css  js  c++  java
  • 关于Dockerfile的写法

    Dockerfile是用来自定义构建镜像的文件。

    Dockerfile:

    FROM nginx
    RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
    
    • FEOM : 指定基于哪个镜像进行自定义
    • RUN : 运行指令, 两种形式
      • RUN 命令
      • RUN ["test.php", "dev", "offline"] 等价于 test.php dev offline

    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
    
    [root@localhost dockerdir]# docker build -t imagetest:test .
    Sending build context to Docker daemon  2.048kB
    Step 1/2 : FROM nginx
     ---> 8cf1bfb43ff5
    Step 2/2 : RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
     ---> Using cache
     ---> 2611d7938c46
    Successfully built 2611d7938c46
    Successfully tagged imagetest:test
    
    [root@localhost dockerdir]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    imagetest           test                2611d7938c46        2 hours ago         132MB
    twilight/nginx      ali                 378d7ca4a813        3 hours ago         229MB
    mysystem            tags                1c174e9fbdee        3 hours ago         64.2MB
    ubuntu              18.04               2eb2d388e1a2        6 days ago          64.2MB
    nginx               latest              8cf1bfb43ff5        9 days ago          132MB
    training/webapp     latest              6fae60ef3446        5 years ago         349MB
    [root@localhost dockerdir]# 
    

    docker build 会将上下文路径中的所有文件打包发送给引擎,所以上下文路径不能放无用的文件,会造成执行过程的缓慢。

    指令

    • COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"] : 目的路径不存在会自动创建。路径支持通配符。

    • ADD 用法与 COPY一致,不同之处在于源文件为 gzip, bzip2, xz格式,会自动解压并复制到目标路径下。

      • 如果目标路径指定的是一个文件,则会覆盖这个文件(即使这个文件已经有内容),不存在就创建新文件
      • 如果目标路径是一个目录,但是这个目录不存在,docker会自动创建目录
    • CMD ["<可执行文件或命令>","<param1>","<param2>",...] CMD <shell 命令> ,用于在容器构建完成后执行的指令

      • 可以写多条CMD,但是只有最后一条会生效
      • Dockerfile中的CMD命令可以被 docker run -it ubuntu 命令中的命令覆盖。
      • RUN是运行在build的时期,而CMD运行在 docker run的时期
    • ENTRYPOINT ["<executeable>","<param1>","<param2>",...] 或者 ENTRYPOINT 命令 跟CMD的效果差不多,但是它始终会执行,或者被替换

      • 如果有多条 ENTRYPOINT命令,那么只有最后一条会生效
      • 如果定义了 ENTRYPOINT ["nginx", "-c"]那么在 docker run后面的参数会被追加到 nginx -c 的后面
      • 如果 ENTRYPOINT ["nginx", "-c"]CMD [""] 同时使用, CMD中的内容也会被追加到 ENTRYPOINT的后面
      • 通过指定 --entrypoint 命令 参数 来覆盖ENTRYPOINT的内容
    • ENV <key> <value> 或者 ENV <key1>=<value1> <key2>=<value2>: 定义的环境变量可以在build和run的时候以 $var的形式引用

    • ARG 和 ENV作用一样,但是仅限于在Dockerfile内生效,可以在 docker build --build-arg key=value来覆盖

    • VOLUME ["<路径1>", "<路径2>"...] 自动挂载数据卷

    • EXPOSE <端口1> [<端口2>...] 声明端口,方便配置

    • WORKDIR <工作目录路径> 目录必须已经存在,在构建镜像的每一层中,该目录都会存在。

    • USER <用户名>[:<用户组>] 切换用户

    • ONBUILD 本次不会执行,但是如果有新的Dockerfile引用了这个镜像,就会执行ONBUILD指定的命令

    参考资料

    https://www.runoob.com/docker/docker-dockerfile.html
    https://blog.csdn.net/shunfa888/article/details/79373840

  • 相关阅读:
    js本地时钟
    《Real Time Rendering》第二章 图形渲染管线
    《Real Time Rendering》第三版 翻译
    《Windows via C/C++》学习笔记(一):Error handling
    《Real Time Rendering》第三章 图形处理单元
    《工程结构优化设计基础》总结
    《TCP/IP协议详解》学习笔记(一):概述
    【转载】四大开源3d游戏引擎探究
    几何非线性中的几个重要概念
    《Windows via C/C++》学习笔记(二):Working with Characters and String
  • 原文地址:https://www.cnblogs.com/twilight0402/p/13412217.html
Copyright © 2011-2022 走看看