Dockerfile编写总结

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 Dockerfile编写总结,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

Dockerfile,是Docker三大核心概念(镜像image,容器container,仓库registry)之一,镜像的构建文件;在 dockerfile 文件所在的目录下面执行 docker build 命令,即可构建一个 image。

Dockerfile文件由一系列构建指令组成,docker build 命令会根据这些构建指令完成Docker镜像的构建,一条命令相当于Image的一层数据卷。

docker build命令会根据Dockerfile文件及上下文构建新Docker镜像。构建上下文是指Dockerfile所在的本地路径或一个URLGit仓库地址)。构建上下文环境会被递归处理,所以,构建所指定的路径还包括了子目录,而URL还包括了其中指定的子模块。

-t参数指定构建成后,镜像的仓库标签等;

如果想要构建出来的image存在多个仓库下,或使用多个镜像标签,就可以使用多个-t参数

构建缓存仅会使用本地父生成链上的镜像。如果不想使用本地缓存的镜像,也可以通过--cache-from指定缓存。指定后将再不使用本地生成的镜像链,而是从镜像仓库中下载;

Dockerfile文件中指令不区分大小写,但为了更易区分,约定使用大写形式。

文件中的第一条指令必须是FROMFROM指令用于指定一个基础镜像。

#开头的是注释

RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

指令 说明
FROM 指定所创建镜像的基础镜像
MAINTAINER 维护者信息
RUN 运行命令
CMD 指定启动容器时默认执行的命令
LABEL 生成镜像的元数据标签信息
EXPOSE 声明镜像内服务所监听的端口
ENV 环境变量
ADD 复制,若源为tar 文件,则会自动解压
COPY 复制本地主机的数据,推荐使用
ENTRYPOINT 镜像的默认入口
VOLUME 创建数据卷挂载点
USER 运行容器时的用户名或者UID
WORKDIR 配置工作目录
ARG 指定镜像内使用的参数(例如版本号信息)
ONBUILD 配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令
STOPSIGNAL 容器退出时的信号值
HEALTHCHECK 如何进行健康检查
SHELL 指定使用shell时的默认shell类型

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FROM
该命令必须放置在我们命令的第一层,首先就会使用该命令。当然一个DokcerFile中存在多个镜像时,可以多次使用FROM命令;
语法:FROM <image>:<tag>  //tag没有的话默认是latest

MAINTAINER
用来制定维护者信息,也可以是作者信息

LABEL
构建生成的镜像的元数据标签,一个容器可以有多个LABEL文件。

ENV
设置环境变量,可以让其他命令来使用此参数。并且还有使用docker inspect 查看这个环境变量值。

ADD
复制命令,将文件复制到镜像中去;
语法:ADD [“<src>”,… “<dest>”]
其中 src 可以使本地文件也可以是压缩文件还可以是url  ,dest  是容器内部的绝对路径,也可以是相对于工作目录的相对路径。

COPY
也是复制命令,不过该命令只能复制本地文件。

RUN
用来运行我们所需要的指令。该命令是构建容器时运行的命令以及提交命令行的结果
语法:
RUN command   //该命令是 直接跟shell命令个 在linux系统中默认 /bin/sh -C  windows中默认是 cmd /S /C  
RUN [“executable”,“param1”,“param2”] 函数调用 都一个参数类似可执行文件,后面是参数 使用exec 来执行的 
总的来说命令较长可以使用 \ 来换行。
RUN  [“/bin/bash”, “-c”, “echo hello”]。
RUN apt-get update && apt-get install -y x11vnc xvfb firefox

ENTRYPOINT
用来指定镜像的默认入口,也是启动的默认命令。语法:
1. ENTRYPOINT [“executable”, “param1”, “param2”]
2. ENTRYPOINT command param1 param2
与CMD的区别:

  • 首先ENTRYPOINT不会被运行的command命令覆盖,CMD指定的命令会被覆盖
  • 如果两者同时存在,当CMD命令不是一个完整的执行命令时,那么CMD的命令参数会被作为ENTRYPOINT的参数,只一个完整的命令时,谁在最后谁执行。

USER
用来指定运行容器时的用户名或者UID。

CMD
用法是启动容器时默认执行的命令。启动容器需要执行的参数,并且一个DockerFile文件中最好只有一个该命令参数。多个话会把最后一个作为最终的目标。
1. CMD [“executable”,”param1″,”param2″]
2. CMD [“param1″,”param2”]
3. CMD command param1 param2
参数执行与RUN 运行类似。引号要使用是双引号,原因是参数传递后 docker用来解析为一个json array

VOLUME
创建数据卷的挂载点,将容器内的文件或者其他容器中的文件挂载在该容器中。授权访问从容器内到宿主主机上的目录。语法:
VOLUME [“目录”]
1. VOLUME [“/home/log/”]
2. VOLUME /home/log
3. VOLUME /home/log /home/db
需要使用数据进行持久化需要该操作。容器使用的是AUFS文件系统。容器关闭的时候数据会丢失,那么数据持久化 就需要使用挂载点来操作。该命令创建的挂载点是无法指定主机上的目录,自动生成的。

WORKDIR
用来配置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效,如果目录不存在会创建,也可以设置多次。切换目录的操作,相对于之前的目录,相当于是Linux系统中的cd。
WORKDIR /home/ruiqi
WORKDIR data
RUN pwd
pwd执行的结果是//home/ruiqi/data
当然如果存在环境变量的值也可以 解析环境变量。

ARG
用来指定一些参数信息。当然该参数可以被 build时使用 –build-arg user =asdasda 指定参数

ONBUILD
当该镜像作为其他镜像的基础镜像时,所设定的命令才会执行。

EXPOSE
声明镜像内服务,即容器在运行时需要监听的端口。暴露给外部使用,加上-P 参数映射或者使用-p映射为指定端口。
// 映射容器私有端口80到公有端口8080
EXPOSE 80:8080
永远不要使用Dockerfile映射公有端口。不然你将可能只能运行一个容器化应用程序的实例。

STOPSIGNAL
容器退出的信号值,当容器退出的时候给系统发送什么样的指令

HEALTHCHECK
进行容器的健康检查。语法有两种:
1. HEALTHCHECK [OPTIONS] CMD command
2. HEALTHCHECK NONE
第一个的功能是在容器内部运行一个命令来检查容器的健康状况
第二个的功能是在基础镜像中取消健康检查命令
[OPTIONS]的选项支持以下三中选项:

  • –interval=DURATION 两次检查默认的时间间隔为30秒
  • –timeout=DURATION 健康检查命令运行超时时长,默认30秒
  • –retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3

注意:
HEALTHCHECK命令只能出现一次,出现多次,只有最后一个生效。
CMD后边的命令的返回值决定本次健康检查是否成功,具体的返回值如下:
0: success – 表示容器是健康的
1: unhealthy – 表示容器已经不能工作;
2: reserved – 保留值
例子:
HEALTHCHECK –interval=5m –timeout=3s \
CMD curl -f http://localhost/ || exit 1
健康检查命令是:curl -f http://localhost/ || exit 1
两次检查的间隔时间是5秒
命令超时时间为3秒

Dockerfile的一些建议

  • 不要开机初始化
  • 不要在构建中升级版本
  • 使用小型基础镜像,建议FROM alpine:3.3
  • 尽量使用格式一致的Dockerfile,这样能使用缓存
  • 不要在构建中升级版本,如在容器中apt-get upgrade
  • 使用特点的标签。如FROM debian:jeesie,而不是FROM debian
  • 常见的命令组合。如:apt-get update与atp-get install组合。此外使用\格式化成多行命令。这样能够最大程度的应用缓存。
  • 使用自己的基础镜像

 

参考:

https://itbilu.com/linux/docker/VyhM5wPuz.html

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/142402.html

(0)

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!