zoukankan      html  css  js  c++  java
  • Dockerfile常用指令使用案例

     ARG使用案例

    ARG:定义创建镜像过程中使用的变量。镜像编译成功后,ARG指定的变量将不再存在。

    登录容器后使用命令:env是查看不到的!

    ENV使用案例

    FROM centos:7
    ENV NODE_VERSION 1.2.3
    WORKDIR /
    
    RUN useradd www
    EXPOSE 22
    VOLUME /huazai
    
    [root@server01 ~]# docker run  -it aa:v9  /bin/bash
    [root@c89864248c57 /]# env
    NODE_VERSION=1.2.3
    

    WORKDIR使用案例:

    [root@server01 ~]# cat  Dockerfile 
    FROM centos:7
    WORKDIR /tmp
    CMD ["pwd"]
    
    [root@server01 ~]# docker run aa:v2
    /tmp
    

    USER 使用案例:

    [root@server01 ~]# cat  Dockerfile 
    FROM centos:7
    RUN useradd www
    USER www
    RUN yum update
    

     报错信息:说用后续的RUN指令也会使用指定的用户www来执行 yum update命令  没有执行权限

    ovl: Error while doing RPMdb copy-up:
    [Errno 13] Permission denied: '/var/lib/rpm/.dbenv.lock'
    You need to be root to perform this command.

    ADD 和COPY使用案例

    add有解压的功能

    [root@server01 ~]# cat Dockerfile 
    FROM centos:7
    
    WORKDIR /tmp
    
    ADD busybox.tar.gz /tmp/
    COPY busybox.tar.gz /usr/local/src/
    CMD ["pwd"]
    

     VOLUME 使用案例,不用声明也可以直接挂载,在容器内部会自动生成一个目录的(疑问!)

    [root@server01 ~]# cat Dockerfile 
    FROM centos:7
    
    VOLUME /huazai
    CMD ["pwd"]
    
    [root@server01 ~]# docker run -it  -v /usr/local/src:/huazai aa:v8  /bin/bash
    [root@601081c78d83 tmp]# ls /huazai/
    ELK.zip              nginx-1.14.2/        redis-5.0.2/         workshop/
    lnmp/                nginx-1.14.2.tar.gz  redis-5.0.2.tar.gz   
    

     ONBUILD 使用案例:创建子镜像时指定自动执行的操作传指令

    父镜像Dockerfile

    FROM centos:7
    RUN yum -y install httpd-tools
    ONBUILD ADD redis-5.0.2.tar.gz /tmp/
    CMD ["ping","-c2","www.baidu.com"]
    

    docker build -t bb:v2 .

    将父镜像构建为bb:v2

    子镜像Dockerfile

    FROM bb:v2
    RUN yum -y install curl
    ENTRYPOINT ["curl","-s","https://www.baidu.com"]
    

    HEALTHCHECK使用案例:

    当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting

    在 HEALTHCHECK 指令检查成功后变为 healthy,如果连续一定次数失败,则会变为 unhealthy

    HEALTHCHECK 支持下列选项:

    • --interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
    • --timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
    • --retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。

    和 CMDENTRYPOINT 一样,HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效。

    在 HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 格式,和 exec 格式。

    命令的返回值决定了该次健康检查的成功与否:0:成功;1:失败;2:保留,不要使用这个值。

    假设我们有个镜像是个最简单的 Web 服务,我们希望增加健康检查来判断其 Web 服务是否在正常工作,

    我们可以用 curl 来帮助判断,其 Dockerfile 的 HEALTHCHECK 可以这么写:

    1. FROM nginx
    2. HEALTHCHECK --interval=5s --timeout=3s
    3. CMD curl -fs http://localhost/ || exit 1

    这里我们设置了每 5 秒检查一次(这里为了试验所以间隔非常短,实际应该相对较长),

    如果健康检查命令超过 3 秒没响应就视为失败,并且使用 curl -fs http://localhost/ || exit 1 作为健康检查命令。

    使用 docker build 来构建这个镜像:

    1. $ docker build -t myweb:v1 .

    构建好了后,我们启动一个容器:

    1. $ docker run ---name web -80:80 myweb:v1

    当运行该镜像后,可以通过 docker container ls 看到最初的状态为 (health: starting)

    1. $ docker container ls
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. 03e28eb00bd0 myweb:v1 "nginx -g 'daemon off" 3 seconds ago Up 2 seconds (health: starting) 80/tcp, 443/tcp web

    在等待几秒钟后,再次 docker container ls,就会看到健康状态变化为了 (healthy)

    1. $ docker container ls
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. 03e28eb00bd0 myweb:v1 "nginx -g 'daemon off" 18 seconds ago Up 16 seconds (healthy) 80/tcp, 443/tcp web

    如果健康检查连续失败超过了重试次数,状态就会变为 (unhealthy)

  • 相关阅读:
    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用
    jQuery UI组件库Kendo UI使用技巧小分享
    Kendo UI ListView模板功能,让Web开发更轻松
    UI组件套包DevExpress ASP.NET Core v20.2新版亮点:全新的查询生成器
    Devexpress WinForms最新版开发.NET环境配置Visual Studo和SQL Server对应版本
    全新的桌面应用数据可视化呈现方式,Sankey Diagram控件你了解多少?
    java中的递归方法
    连接数据库查询 将查询结果写入exce文件中
    java连接mysql数据查询数据
  • 原文地址:https://www.cnblogs.com/xiaonan1/p/12965775.html
Copyright © 2011-2022 走看看