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 次。
和 CMD
, ENTRYPOINT
一样,HEALTHCHECK
只可以出现一次,如果写了多个,只有最后一个生效。
在 HEALTHCHECK [选项] CMD
后面的命令,格式和 ENTRYPOINT
一样,分为 shell
格式,和 exec
格式。
命令的返回值决定了该次健康检查的成功与否:0
:成功;1
:失败;2
:保留,不要使用这个值。
假设我们有个镜像是个最简单的 Web 服务,我们希望增加健康检查来判断其 Web 服务是否在正常工作,
我们可以用 curl
来帮助判断,其 Dockerfile
的 HEALTHCHECK
可以这么写:
FROM nginx
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1
这里我们设置了每 5 秒检查一次(这里为了试验所以间隔非常短,实际应该相对较长),
如果健康检查命令超过 3 秒没响应就视为失败,并且使用 curl -fs http://localhost/ || exit 1
作为健康检查命令。
使用 docker build
来构建这个镜像:
$ docker build -t myweb:v1 .
构建好了后,我们启动一个容器:
$ docker run -d --name web -p 80:80 myweb:v1
当运行该镜像后,可以通过 docker container ls
看到最初的状态为 (health: starting)
:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03e28eb00bd0 myweb:v1 "nginx -g 'daemon off" 3 seconds ago Up 2 seconds (health: starting) 80/tcp, 443/tcp web
在等待几秒钟后,再次 docker container ls
,就会看到健康状态变化为了 (healthy)
:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03e28eb00bd0 myweb:v1 "nginx -g 'daemon off" 18 seconds ago Up 16 seconds (healthy) 80/tcp, 443/tcp web
如果健康检查连续失败超过了重试次数,状态就会变为 (unhealthy)
。