作用:必须放在第一行,一个dockerfile中只能有一个FROM关键字
FROM指定基础镜像,每一个定制镜像,必须以一个现有镜像为基础。因此一个Dockerfile中FROM是必须的指令,并且必须是第一条。后续的指令都依赖于该指令指定的 image。FROM 指令指定的基础 image 可以是官方远程仓库中的,也可以位于本地仓库
使用格式:
FROM <image>:<tag> # 注释以#开头。基础镜像的tag可不指定,默认使用latest # 示例:
FROM mysql:5.7
FROM centos:7.2
FROM centos
作用:指定镜像的作者信息,包含镜像的所有者和联系人信息
构建指令,用于将 image 的制作者相关的信息写入到 image 中。当我们对该 image 执行 docker inspect 命令时,输出中有相应的字段记录该信息。
使用格式:
常见格式:MAINTAINER 用户名 邮箱
MAINTAINER wangyang "wangyang@itxdl.cn"
作用:
为镜像添加label以方便组织镜像,记录元数据信息,帮助自动化实现等等。字符串中包含空格需要转义或包含在引号中
使用格式:
LABEL(关键字)+key=valule 的格式(如果值中间有空格比较奇怪的,用双引号隔起来,表示是一整个字符串)
# 指令将元数据添加到镜像。`LABEL` 是键值对。要在 `LABEL` 值中包含空格,请像在命令行中一样使用引号和反斜杠
方法一:每一个键值对对应一个关键字
# Set one or more individual labels
LABEL com.example.version="0.0.1-beta"
LABEL vendor1="ACME Incorporated"
LABEL com.example.release-date="2019-09-12"
LABEL com.example.version.is-production=""
方法二:一个关键字,后面跟键值对,键值对之间使用空格隔开
# Set multiple labels on one line
LABEL com.example.version="0.0.1-beta" com.example.release-date="2019-09-12"
方法三:多行标签定义方式,使用换行符书写,一个关键字对应
# Set multiple labels at once, using line-continuation characters to break long lines
LABEL vendor=ACME\ Incorporated \
com.example.is-beta= \
com.example.is-production="" \
com.example.version="0.0.1-beta" \
com.example.release-date="2019-09-12"
标签的继承性和重写性(后面覆盖前面)
docker image inspect --format='' myimage
添加一个标签
mkdir test1
cd test1/
vim Dockerfile
FROM busybox
LABEL author=zhujiantang
将文件制作为镜像(在dockfile文件当前目录执行)
docker build -t zjt:v1 . --no-cache
安装 jq
yum install epel-release
yum install jq
查看标签:从当前找Dockerfile剧本文件创建镜像名为zjt
docker image inspect zjt:v1 --format "{{json .ContainerConfig.Labels}}" | jq
验证标签的继承性
添加一个标签
cd test1/
vim Dockerfile
FROM zjt:v1
LABEL version=v2
将文件制作为镜像(在dockfile文件当前目录执行)
docker build -t zjt:v2 . --no-cache
查看标签:从当前找Dockerfile剧本文件创建镜像名为zjt
docker image inspect zjt:v2 --format "{{json .ContainerConfig.Labels}}" | jq
标签的重写性
添加一个标签
cd test1/
vim Dockerfile
FROM zjt:v2
LABEL version=v3
将文件制作为镜像(在dockfile文件当前目录执行)
docker build -t zjt:v3 . --no-cache
查看标签:从当前找Dockerfile剧本文件创建镜像名为zjt
docker image inspect zjt:v3 --format "{{json .ContainerConfig.Labels}}" | jq
作用:
构建指令,RUN 可以运行任何被基础 image 支持的命令。如基础 image 选择了 Centos,那么软件管理部分只能使用 Centos 的包管理命令
用来执行命令行命令,是最常用的指令之一。使用格式,
# shell格式,跟直接在命令行输入命令一行
RUN <命令>
# 示例:RUN mkdir -p /usr/src/redis
# exec格式,类似于函数调用
RUN ["可执行文件", "参数1", "参数2"]
作用:
格式:
USER <用户名>[:<用户组>]
USER daemon = ENTRYPOINT ["memcached", "-u", "daemon"]
作用:
EXPOSE <端口1> [<端口2>...] **最佳实践建议** 1. 应该使用常用的惯用的端口,如nginx 80,mongoDB 27017
扩展:dockfile文件如果没有前台进程,设置一个前台进程
作用
ENV设置环境变量,无论是后面的其它指令,如 RUN(使用 $环境变量key 的形式) ,还是运行时的应用,都可以直接使用这里定义的环境变量。
使用格式有两种,
设置环境变量的时机:
①制作docker镜像时env设置;
注意:
docker run的env比dockerfile中的env优先级更高(范围性小的优先级大于范围性大的)
作用
ARG设置构建参数,即docker build命令时传入的参数。和ENV的效果差不多,都是设置环境变量,不同的是,ARG设置的是构建环境的环境变量,在容器运行时是不会存在这些环境变量的。
Dockerfile中的ARG指令是定义参数名称,以及默认值(可选)。该默认值可以在执行构建命令docker build时用 –build-arg <参数名>=<值> 来覆盖。
ARG和ENV起作用的时机不同:
使用格式
ARG <参数名>[=<默认值>] **最佳实践建议** 1. 不要使用ARG来保存密码之类的信息,因为通过docker history还是可以看到docker build执行时的所有值 2. 使用ARG,对于使用CI系统(持续集成),用同样的构建流程构建不同的 Dockerfile 的时候比较有帮助,避免构建命令必须根据每个 Dockerfile 的内容修改
<!--这里的变量用的就是 `ARG` 而不是 `ENV`了,因为这条命令运行在 `Dockerfile` 当中的, 像这种临时使用一下的变量没必要存环境变量的值就很适合使用 `ARG`-->
作用:
作用都是将文件或目录复制到Dockerfile构建的镜像中
用法格式:
ADD <src> <dest>
示例:
[root@zjt13 test1]# ls
Dockerfile
[root@zjt13 test1]# touch zjt.sh
[root@zjt13 test1]# vim Dockerfile
创建容器
docker build -t add:v1 .
docker run --name add13 add:v1
docker exec -it add13 /bin/sh
作用:
设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是 AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在 Dockerfile中 使用该指令
格式用法:
FROM base
VOLUME ["/tmp/data"]
作用:
在容器内部设置工作目录,这样ENTRYPOINT和CMD指定的命令都会在容器中这个目录下进行。设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效
格式用法:
WORKDIR /p1 WORKDIR p2 RUN vim a.txt
添加一个标签
cd test1/
vim Dockerfile
FROM nginx:v1
WORKDIR /usr/local/nginx
将文件制作为镜像(在dockfile文件当前目录执行)
docker build -t nginx:v1 . --no-cache
docker exec -it workdir /bin/bash
生产环境中用于将容器经常使用的目录修改为登陆后的默认目录
作用:
用法格式:
作用:
与CMD类似,ENTRYPOINT不会被docker run中指定的命令覆盖,如果想覆盖ENTRYPOINT,则需要在docker run中指定--entrypoint选项
用法格式:
重点理解:
cmd 给出的是一个容器的默认的可执行体。也就是容器启动以后,默认的执行的命令,# 如果我们在 run 时指定了命令或者有entrypoint,那么 cmd 就会被覆盖。仍然是上面的 image。run 命令变了:
docker run xx echo glgl
==> glgl
作用:
用法格式:
STOPSIGNAL 指令设置将发送到容器以退出的系统调用信号。这个信号可以是一个有效的无符号数字,与内核的`syscall`表中的位置相匹配,例如`9`,或者是`SIGNAME`格式的信号名,例如:SIGKILL
注意
HEALTHCHECK 命令只能出现一次,如果出现了多次,只有最后一个生效
模板
HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1
查看容器的健康状态
$ docker inspect –format ‘{{json .State.Health.Status}}’ cID
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。