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)

原文地址:https://www.cnblogs.com/xiaonan1/p/12965775.html