『中级篇』Dockerfile详解(17)

作者: IT人故事会 | 来源:发表于2018-06-17 12:16 被阅读44次

    一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

    官网学习

    https://docs.docker.com/engine/reference/builder/#usage

    FROM

    必须为第一个命令,指定基础镜像

    FROM <image>
    FROM <image>:<tag>
    FROM <image>@<digest>
    
    FROM scratch #制作base Image
    FROM centos #使用base Image
    FROM centos:7.9
    FROM mysql:5.6
    

    尽量使用官方的image作为base image!那是经得起考验的!

    LABEL

    给镜像添加信息。使用docker inspect可查看镜像的相关信息

    LABEL maintainer="394498036@qq.com"
    LABEL version="1.0"
    LABEL description="This is description \
    欢迎关注:编程坑太多,我在等你."
    

    其实就类似咱们写代码的注释,很多人写代码不愿意写注释,其实写注释对自己的负责,过段时间翻坑的时候,想想当初的意思,容易很快的解决,所以一定要写LABEL

    RUN

    构建镜像时执行的命令

    RUN yum update && yum install -y vim \
              python-dev #反斜线换行
    
    RUN  apt-get update && apt-get install -y perl \
              pwgen --no-install-recommends && rm -rf \
              /var/lib/apt/lists/*   #注意清理cache
    
    RUN  /bin/bash -c 'source $HOME/.bashrc;echo $HOME'
    

    为了美观,复杂的RUN请用反斜线换行,避免无用分层,合并多条命令成一行!

    WORKDIR

    工作目录

    WORKDIR /test #如果没有会自动创建test目录
    WORKDIR jianshu
    RUN pwd          #输出结果应该是/test/jianshu
    

    用WORKDIR,不要用RUN cd 尽量使用绝对目录!

    ADD and COPY

    1. 将本地文件添加到容器中,identity, gzip, bzip2,xz,tar.gz,tgz等类型的文件将被添加tar -x命令,进行解压
    2. 同ADD,只是不会解压文件。
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
    COPY <src>... <dest>
    COPY ["<src>",... "<dest>"] 用于支持包含空格的路径
    
    ADD hello /
    ADD test.tar.gz / #添加到根目录并解压
    WORKDIR /root
    ADD hello test/ # /root/test/hello
    
    WORKDIR /root
    COPY hello test/ # /root/test/hello
    

    大部分情况,COPY优于ADD,ADD除了COPY还有额外功能(解压缩)!添加远程文件/目录请使用curl 或者wget

    ENV

    设置环境变量

    ENV <key> <value>
    ENV <key>=<value> ...
    
    ENV MYSQL_VERSION 5.6
    E-NV apt-get install -y mysql-server = "${MYSQL_VERSION}" \
    && rm -rf /var/lib/apt/lists/* #引用常亮
    

    尽量多使用,减少维护成本!

    学习下面的先了解下

    Shell 和Exec 格式

    • Shell格式
    RUN apt-get install -y vim
    CMD echo "hello docker  微信公众号:编程坑太多"
    ENTRYPOINT echo "hello docker 微信公众号:编程坑太多"
    
    • Exec格式
    RUN ["apt-get", "install", " -y", "vim"]
    CMD ["/bin/echo","hello docker  微信公众号:编程坑太多"]
    ENTRYPOINT ["/bin/echo","hello docker 微信公众号:编程坑太多"]
    

    • Dockerfile1
    FROM centos
    ENV name Docker
    ENTRYPOINT  echo "hello  $name"
    
    • Dockerfile2
    FROM centos
    ENV name Docker
    ENTRYPOINT ["/bin/echo", "hello  $name"]
    

    通过实际的例子查看区别。

    mkdir cmd-entrrypoint
    cd cmd-entrrypoint/
    vi Dockerfile
    
    • 先执行Dockerfile1


    more Dockerfile
    
    docker build -t liming/centos-entrypoint-shell .
    
    docker run liming/centos-entrypoint-shell 
    
    • 先执行Dockerfile2


    more Dockerfile
    
    docker build -t  liming/centos-entrypoint-exec .
    
    docker run  liming/centos-entrypoint-exec
    

    我们通过shell格式运行的话,它会通过默认的bash里面通过shell执行命令,它会通过shell替换这边变量,通过exec格式运行的话,只是单纯的执行echo,没办法帮我们替换到$name。如何解决不一样的问题呢?请开始我的表演!修改Dockerfile2

    FROM centos
    ENV name Docker
    ENTRYPOINT ["/bin/bash","-c", "echo hello  $name"]
    
    docker build -t liming/centos-entrypoint-exec-new .
    
    docker run liming/centos-entrypoint-exec-new
    

    是不是很nice!

    CMD

    设置容器启动后默认执行的命令和参数

    • 容器启动时默认执行的命令
    • 如果docker run 指定了其他命令,CMD命令被忽略
    • 如何定义了多个CMD,只有最后一个会执行
    FROM centos
    ENV name Docker
    CMD echo "hello $name"
    
    docker build -t liming/centos-cmd-shell .
    docker run liming/centos-cmd-shell
    docker run -it liming/centos-cmd-shell /bin/bash
    

    ENTRTYPOINT

    设置容器启动时运行的命令

    • 让容器以应用程序或者服务的形式运行
    • 不会被忽略,一定会执行
    FROM centos
    ENV name Docker
    ENTRYPOINT echo "hello $name"
    
    docker build -t liming/centos-entrypoint-shell .
    docker run liming/centos-entrypoint-shell
    docker run -it liming/centos-entrypoint-shell /bin/bash
    

    PS:Dockerfile详解基本就介绍这么多,可能还有很多命令没有讲解,以后用到了在说吧。一定要CMD和ENTRTYPOINT因为很多官方的都常用这两个命令。


    往期精彩
    1. docker导学(一)
    2. 容器的技术概述(二)
    3. docker的魅力初体验-5分钟安装wordpress不走弯路(三)
    4. docker官网介绍(四)
    5. 如何在mac上安装docker(五)
    6. 如何在window上安装docker(六)
    7. 如何在mac上通过vagrant安装虚拟机(七)
    8. 如何在window上通过vagrant安装虚拟机(八)
    9. docker-Machine的本地使用(九)
    10. docker-Machine的本地使用(十)
    11. 在linux/mac下通过Docker-Machine在阿里云上的使用(11)
    12. docker架构和底层技术(12)
    13. docker Image概述(13)
    14. 手动建立一个base Image(14)
    15. 什么是Container(15)
    16. 构建自己的Docker镜像(16)

    相关文章

      网友评论

        本文标题:『中级篇』Dockerfile详解(17)

        本文链接:https://www.haomeiwen.com/subject/ergisftx.html