首页 Docker教程docker-dockerfile指令详细介绍

docker实战-dockerfile制作镜像

dockerfile实战-制作基础镜像的Base镜像

运维派是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai

Dockerfile 相关指令

dockerfile 文件中的常见指令:

FROM:指定基础镜像

定制镜像,需要先有一个基础镜像,在这个基础镜像上进行定制。FROM 就是指定基础镜像,此指令必需放在有效指令的第一行。怎么选择合适的镜像呢?对于不同的软件官方都提供了相关的docker镜像,比如:nginx、redis、mysql、httpd、tomcat等服务类的镜像,也有操作系统类,如:centos、ubuntu、debian等。建议使用官方镜像,比较安全。

格式:

范例:

LABEL:指定镜像元数据

可以指定镜像元数据,如:镜像作者等

范例:

范例:多标签写法

docker inspect 命令可以查看LABEL

范例:

MAINTAINER: 指定维护者信息

此指令已过时,用LABEL代替

范例:

RUN:执行shell命令

RUN 指令是用来执行命令的。shell命令功能丰富,所以RUN 指令经常用来调用shell指令

注意:run可以写多个,每一个run指令都会建立一层,所以尽可能合并成一条指令

范例:

COPY:复制文本

复制本地主机的 (为 Dockerfile 所在目录的相对路径)到容器中的

说明:

  • 可以是多个、以及使用通配符,通配符规则满足Go的filepath.Match 规则
  • 使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等
  • 如果是目录,只复制目录内容,而非目录本身

范例:

ADD:复制和解包文件

该命令可认为是增强版的COPY,不仅支持COPY,还支持解缩。可以将复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可是一个 URL;还可是一个 tar 文件(自动解压)。

说明:

  • 如果src是目录,只复制目录中的内容,而非目录本身
  • 如果src是本地打包或压缩文件,如gzip, bzip2 ,xz ,将解包
  • 如果src是一个 URL ,下载后的文件权限自动设置为 600

范例:

CMD:容器启动命令

指定启动容器时默认执行的命令,即:如果docker run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT,那么就会使用执行CMD指定的默认的命令

每个 Dockerfile 只能有一条 CMD 命令。如指定了多条,只有最后一条被执行

如果用户启动容器时指定了运行的命令,如:docker run xxx /bin/bash,则/bin/bash 会覆盖 CMD 指定的命令

范例:

范例:

ENTRYPOINT:入口点

功能类似于CMD,配置容器启动后执行的命令及参数,并且不可被 docker run 提供的参数覆盖,而是追加

如果docker run命令有参数,那么参数全部都会作为ENTRYPOINT的参数。如果docker run后面没有额外参数,但是dockerfile中的CMD里有(即上面CMD的第三种用法),那么CMD的全部内容会作为ENTRYPOINT的参数

可以通过docker run --entrypoint 参数在运行时替换

使用CMD要在运行时重新写命令才能追加运行参数,ENTRYPOINT则可以运行时接受新参数

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个生效

范例:

ENV:设置环境变量

指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持

范例:

ARG:构建参数

指定变量

如果和ENV同名,ENV覆盖ARG变量

和ENV不同的是,容器运行时不会存在这些环境变量

可以用 docker build --build-arg <参数名>=<值> 来覆盖

范例:

VOLUME:挂载点

在容器中创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等,一般会将宿主机上的目录/var/lib/containers/storage/volumes/<id>/_data挂载至VOLUME 指令指定的容器目录。即使容器后期删除,此宿主机的目录仍会保留,从而实现容器数据的持久保存。

范例:在容器创建一个/data/ 的挂载点

范例:

EXPOSE:暴露端口

告诉 Docker 服务端容器暴露的端口号,供互联系统使用。

EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射

因此,在启动容器时需要通过 -P 或-p ,Docker 主机会分配一个端口转发到指定暴露的端口,才可以使用

WORKDIR:指定工作目录

为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内的默认目录

范例:

可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

则最终路径为 /a/b/c

ONBUILD:子镜像引用父镜像的指令

可以用来配置当创建当前镜像的子镜像时,会自动触发执行的指令。

例如,Dockerfile 使用如下的内容创建了镜像 image-A。

如果基于 image-A 创建新的镜像时,新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行ONBUILD 指令内容,等价于在后面添加了两条指令。

使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild

USER:指定当前用户

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户

当服务不需要管理员权限时,可以通过该命令指定运行用户

这个用户必须是事先建立好的,否则无法切换

要临时获取管理员权限可以使用 gosu,而不推荐 sudo

范例:

HEALTHCHECK:健康检查

检查容器的健康性

范例

STOPSIGNAL:退出容器的信号

STOPSIGNAL指令设置将被发送到容器退出的系统调用信号。该信号可以是与内核syscall表中的位置匹配的有效无符号数字(例如9),也可以是SIGNAME格式的信号名称(例如SIGKILL)

.dockerignore文件

官方文档:https://docs.docker.com/engine/reference/builder/#dockerignore-file
与.gitignore文件类似,生成构建上下文时Docker客户端应忽略的文件和文件夹指定模式。

范例:

范例:

Dockerfile文件指令总结

docker-dockerfile指令详细介绍插图

本文链接:http://www.yunweipai.com/34830.html

docker实战-dockerfile制作镜像

dockerfile实战-制作基础镜像的Base镜像

网友评论comments

发表评论

电子邮件地址不会被公开。 必填项已用*标注

暂无评论

Copyright © 2012-2020 YUNWEIPAI.COM - 运维派
扫二维码
扫二维码
返回顶部