• Dockerfile中的RUN、CMD 和 ENTRYPOINT指令的两种格式(shell与exec)


    shell格式与exec格式

    RUN:设置构件容器时就运行的命令以及提交运行结果,RUN经常用于安装软件包。dockerfile中可以写多条RUN指令
    CMD:设置容器启动时执行的命令,在构件时并不运行,CMD能够被docker run后面跟的命令行参数替换。dockerfile中只能写一条CMD指令,如果写了多条,那么只有最后一条生效。
    ENTRYPOINT:设置容器启动时执行的命令,ENTRYPOINT不能被docker run后面跟的命令行参数替换。dockerfile中只能写一条ENTRYPOINT指令,如果写了多条,那么只有最后一条生效。

    我们可用两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令

    shell格式: <instruction> <command>

    exec格式 : <instruction> ["executable", "param1", "param2", ...]

    1.下载并导入镜像

    镜像:

    busybox.tar

    #1.busybox.tar:是一个自定义的镜像
    [root@foundation66 Desktop]# ls
    busybox.tar
    #2.导入镜像
    [root@foundation66 Desktop]# docker load -i busybox.tar
    8a788232037e: Loading layer 1.37MB/1.37MB
    Loaded image: busybox:latest
    #3.查看镜像
    [root@foundation66 Desktop]# docker images

    在这里插入图片描述

    2.编写Dockerfile

    [root@foundation66 ~]# cd /opt/docker/
    [root@foundation66 docker]# ls
    Dockerfile dvd.repo webdata
    #1.创建目录
    [root@foundation66 docker]# mkdir test
    [root@foundation66 docker]# cd test/
    #2.编写文件
    [root@foundation66 test]# vim Dockerfile
    #########################
    FROM busybox        #指定基础镜像
    ENV name world        #设置环境变量
    CMD echo "hello,$name"     #输出hello world;CMD表示容器启动时执行的命令;当指令执行时,shell格式底层会调用/bin/sh -c <command> 。

    注:如果以上CMD和ENTPYPOINT输出的话,会优先输出ENTPYPOINT中的数据.因为ENTPYPOINT会比CMD提前一些执行。

    在这里插入图片描述

    3.构建镜像

    [root@foundation66 test]# docker build -t busybox:v1 .

    在这里插入图片描述

    4.创建并运行容器

    #--rm表示退出后自动删除
    [root@foundation66 test]# docker run --rm busybox:v1
    hello,world

    5.改进

    #1.标准写法为 CMD [ ]
    [root@foundation66 test]# vim Dockerfile
    #########################
    FROM busybox
    ENV name world
    CMD ["/bin/echo","hello,$name"]    #当指令执行时,exec格式会直接调用<command>,不会被 shell解析。会打印出hello $name,shell环境有变量,不是shell环境下没有变量。

    在这里插入图片描述

    #构建镜像
    [root@foundation66 test]# docker build -t busybox:v2 .

    在这里插入图片描述

    #创建并运行容器;发现无法识别变量
    [root@foundation66 test]# docker run --rm busybox:v2
    hello,$name    

    #2.-c表示自动解析变量
    [root@foundation66 test]# vim Dockerfile
    #########################
    FROM busybox
    ENV name world
    CMD ["/bin/sh","-c","echo hello,$name"]    #-c表示自动解析变量,输出结果:hello world,所以一般推荐使用这类形式

    在这里插入图片描述

    #构建镜像
    [root@foundation66 test]# docker build -t busybox:v3 .

    在这里插入图片描述

    #创建并运行容器
    [root@foundation66 test]# docker run --rm busybox:v3
    hello,world

    ENTRYPOINT与CMD指令:

    #1.编写Dockerfile
    [root@foundation66 test]# vim Dockerfile
    ########################
    FROM busybox
    ENTRYPOINT ["/bin/echo","hello"]   #ENTRYPOINT表示设置容器启动时执行的命令,可以自动解析变量,如果ENTPYPOINT在前,CMD在后,就会按照先输出ENTPROPINT,然后再输出CMD。

    CMD ["world"]             #CMD表示设置容器启动时执行的命令,它能够被docker run后面跟的命令行参数替换

    在这里插入图片描述

    #2.构建镜像
    [root@foundation66 test]# docker build -t busybox:v4 .

    在这里插入图片描述

    #3.创建并运行容器;CMD可被覆盖(可传值)
    [root@foundation66 test]# docker run --rm busybox:v4
    hello world
    [root@foundation66 test]# docker run --rm busybox:v4 westos
    hello westos

    注意:如果镜像创建错误,执行以下命令即可删除镜像

    [root@foundation66 test]# docker rmi busybox:v4
    Untagged: busybox:v4
    Deleted: sha256:47bb4f0aee1cc1c78e7f21fe3e3105e1e4dd8d01e2f8005c135999ee136b6576
    Deleted: sha256:ecea84c1280d6278e431138f865fe53ad78aefd50b94797c7b732d725622156f

  • 相关阅读:
    页面 分页加载图文 微服务架构
    二阶段 三阶段 提交 Paxos
    SignatureDoesNotMatch REST接口 在任何时间、任何地点、任何互联网设备上 在Header中包含签名
    tmp
    base64 hash sha
    对云资源服务商资源读写的架构思考:前端代码走token
    微信小程序存放视频文件到阿里云用到算法js脚本文件
    REST RPC HTTP vs 高性能二进制协议 序列化和通信协议
    角色 演员
    服务端签名后直传 服务端签名直传并设置上传回调
  • 原文地址:https://www.cnblogs.com/yangzp/p/14250021.html
Copyright © 2020-2023  润新知