Dockerfile 基本命令
1. 前言
Dockerfile 是用来构建自定义 Docker 镜像的文本文档。我们通过docker build
命令用于从Dockerfile 文件构建镜像。如果你要构建自定义镜像,Dockerfile 是你必须学会的技能之一。
2. Dockerfile 的基本结构
Dockerfile 一般分为:基础镜像、镜像元信息、镜像操作指令和容器启动时执行指令,#
为 Dockerfile 中的注释。
3. Dockerfile 文件说明
Docker 从上到下的顺序运行Dockerfile 的指令,每一个指令都以 step
为步骤。而且文件的命名也必须为 Dockerfile
。
4. Dockerfile 常用的指令。
接下来对常用的 Dockerfile 指令进行总结。
4.1 FROM 指令
FROM
是指定基础镜像,必须为第一个命令,格式:
FROM <image>:<tag>
其中 tag
或 digest
是可选的,如果不使用这两个值时,会使用 latest
版本的基础镜像。
示例: FROM mysql:5.6
4.2 MAINTAINER 指令
MAINTAINER
用来声明维护者信息,该命令已经过期,推荐使用 LABEL
,格式:
MAINTAINER <name>
4.3 LABEL 指令
LABEL:用于为镜像添加元数据,多用于声明构建信息,作者、机构、组织等。格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例: LABEL version="1.0" description="felord.cn" by="Felordcn"
使用LABEL
指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
4.4 ENV 指令
ENV
用来设置环境变量,格式:
ENV <key> <value>
# 之后的所有内容均会被视为其的组成部分,因此,一次只能设置一个变量
ENV <key>=<value> ...
#可以设置多个变量,每个变量为一个"="的键值对,如果中包含空格,可以使用\来进行转义,也可以通过""来进行标识;另外,\
也可以用于续行
示例: ENV version 1.0.0
或者 ENV version=1.0.0
可以通过 ${key}
在其它指令中来引用变量,如 ${version}
。我们也可以通过 docker run
中的 -e <ENV>
来动态赋值
4.5 ARG 指令
ARG
用于指定传递给构建运行时的变量,格式:
ARG <name>[=<default value>]
通过 docker run
中的 --build-arg <key>=<value>
来动态赋值,不指定将使用其默认值。
4.6 WORKDIR 指令
WORKDIR
用来指定工作目录,类似于我们通常使用的cd
命令,格式:
WORKDIR <PATH>
通过 WORKDIR
设置工作目录,Dockerfile 中的其它指令 RUN
、CMD
、ENTRYPOINT
、ADD
、COPY
等命令都会在该目录下执行。在使用 docker run
运行容器时,可以通过 -w
参数覆盖构建时所设置的工作目录。
4.7 ADD 指令
ADD
用于将本地文件添加到镜像中,tar
类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似 wget
,格式:
ADD <src>... <dest>
# 用于支持包含空格的路径
ADD ["<src>",... "<dest>"]
示例:
ADD home /path/ # 支持通配符 添加所有以"home"开头的文件 到/path/ 下
4.8 COPY 指令
COPY
的功能类似于 ADD
,但是不会自动解压文件,也不能访问网络资源
4.9 RUN 指令
RUN
用来执行构建镜像时执行的命令,有以下两种命令执行方式:
shell
执行格式:
RUN <command>
示例:RUN apk update
exec
执行格式:RUN ["executable", "param1", "param2"]
示例: RUN ["/dev/file", "p1", "p2"]
需要注意的是:RUN
指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用缓存镜像,可在构建时指定 --no-cache
参数,示例:docker build --no-cache
4.10 CMD 指令
CMD
构建容器后执行的命令,也就是在容器启动时才执行的命令。格式:
# 执行可执行文件,优先执行
CMD ["executable","param1","param2"]
# 设置了 ENTRYPOINT,则直接调用ENTRYPOINT添加参数 参见 CMD 讲解
CMD ["param1","param2"]
# 执行shell命令
CMD command param1 param2
示例: CMD ["/usr/bin/bash","--help"]
CMD
不同于 RUN
,CMD
用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
4.11 ENTRYPOINT 指令
ENTRYPOINT
用来配置容器,使其可执行化。配合 CMD
可省去 application
,只使用参数。格式:
#可执行文件, 优先
ENTRYPOINT ["executable", "param1", "param2"]
# shell内部命令
ENTRYPOINT command param1 param2
示例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
ENTRYPOINT
与 CMD
非常类似,不同的是通过 docker run
执行的命令不会覆盖 ENTRYPOINT
,而 docker run
命令中指定的任何参数都会被当做参数再次传递给 ENTRYPOINT
指令。Dockerfile 中只有最后一个 ENTRYPOINT
命令起作用,也就是说如果你指定多个ENTRYPOINT
,只执行最后的 ENTRYPOINT
指令。
4.12 EXPOSE 指令
EXPOSE
指定与外界交互的端口,格式:
EXPOSE <port> [<port>...]
示例: EXPOSE 8080 443
、EXPOSE 80
、EXPOSE 11431/tcp 12551/udp
EXPOSE
并不会直接让容器的端口映射主机。宿主机访问容器端口时,需要在 docker run
运行容器时通过 -p
来发布这些端口,或通过 -P
参数来发布EXPOSE
导出的所有端口
4.13 VOLUME 指令
VOLUME
用于指定持久化目录, 格式:
VOLUME ["<src>",...]
示例:VOLUME ["/data"]
,VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
卷可以容器间共享和重用
容器并不需要要和其它容器共享卷
修改卷后会立即生效
对卷的修改不会对镜像产生影响
卷会一直存在,直到没有任何容器在使用它
和 EXPOSE
指令类似, VOLUME
并不会挂载的宿主机,需要通过 docker run
运行容器时通过 -v
来映射到宿主机的目录中。参见另一个命令 docker volume create
4.14 USER 指令
USER
指定运行容器时的用户名或 UID
,后续的 RUN
也会使用指定用户。使用 USER
指定用户时,可以使用用户名、UID
或GID
,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,格式:
USER user
USER user:group
USER uid:group
USER uid
USER user:gid
USER uid:gid
使用 USER
指定用户后,Dockerfile 中其后的命令 RUN
、CMD
、ENTRYPOINT
都将使用该用户。你可以通过 docker run
运行容器时,可以通过 -u
参数来覆盖指定用户。
4.15 ONBUILD 指令
ONBUILD
作用是其当所构建的镜像被用做其它镜像的基础镜像,该镜像中的 ONBUILD
中的命令就会触发,格式:
ONBUILD [INSTRUCTION]
示例:
ONBUILD ADD . /application/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
5. 总结
今天对构建 Docker 镜像脚本 Dockerfile 基本命令进行的详细的总结,并加以举例说明,相信能解决你在构建镜像中的一些困惑。敬请多多关注微信公众号:Felordcn ,后续将会有更多干货奉上。
附: Spring Boot Dockerfile
# 使用 aws 的java jdk 8
FROM amazoncorretto:8
# 作者等相关的元信息
LABEL AUTHOR=Felordcn OG=felord.cn
# 挂载卷
VOLUME ["/tmp","/logs"]
# 时区
ENV TZ=Asia/Shanghai
# 启用配置文件 默认为 application.yml
ENV ACTIVE=defualt
# 设置镜像时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 修改为打包后的jar文件名称
ADD /target/flyway-spring-boot-1.0.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=${ACTIVE}","-jar","app.jar"]
Dockerfile 基本命令的更多相关文章
- Dockerfile 自动制作 Docker 镜像(一)—— 基本命令
Dockerfile 自动制作 Docker 镜像(一)-- 基本命令 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:手动制作Do ...
- docker-网络基础配置和dockerfile
00x1: 端口映射: 如图:这就是把容器的 5000端口和主机的32768端口相映射,所以通过访问主机的32768端口就可以访问容器的web界面 这个端口是系统默认的如果自定义命令:docker r ...
- Docker02 基本命令、开发环境搭建、docker安装nginx、Dockerfile、路径挂载
1 基本命令 1.1 docker相关 centos6.5 安装docker环境 >sudo yum install -y http://mirrors.yun-idc.com/epel/6/i ...
- Docker基本命令与使用 —— Dockerfile指令与构建(三)
一.Dockerfile指令上 1.指令格式 # Comment 注释, 以#开头 INSTRUCTION argument 以大写的指令+参数 #First Dockerfile 注释 FROM u ...
- Hexo+Github博客最简教程-Dockerfile自动搭建
闲谈 拿出你的气质,打开你的电脑,借你半小时搭建好属于你的hexo博客,小生用dockerfile自动帮你搭建好:你只需要在你的mac或linux或windows上提前把docker安装好,如何安装不 ...
- [置顶]
docker--基础镜像和dockerfile
制作基础镜像 注意:需要在CentOS6下操作 准备工作 yum -y install febootstrap 下载ISO镜像文件到服务器 mkdir /mnt/centos6/ mount -o l ...
- Dokcer基础使用总结(Dockerfile、Compose、Swarm)
Dokcer基础 查看Linux版本 uname -r 查看Linux详尽信息 cat /etc/*elease CentOS Linux release (Core) NAME="Cent ...
- Dockerfile语法梳理
Dockerfile语法 我们先来看一下上篇的 Dockerfile #获取base image FROM adoptopenjdk/openjdk8:latest #类似于执行 linux指令 RU ...
- Dockerfile极简入门与实践
前文中,罗列了docker使用中用到的基本命令 此文,将会对怎样使用Dockerfile去创建一个镜像做简单的介绍 Dockerfile命令 要开始编写Dockerfile,首先要对相关的命令有个清晰 ...
随机推荐
- ROC曲线 VS PR曲线
python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...
- 【C++】C++中重载运算符和类型转换
输入输出运算符 输入输出运算符 输入输出运算符 算术和关系运算符 相等运算符 关系运算符 赋值运算符 复合赋值运算符 下标运算符 递增和递减运算符 成员访问运算符 函数调用运算符 lambda是函数对 ...
- 【Python】解析Python中的异常操作
目录结构: contents structure [-] try,except,else,finally块 异常处理 使用except而不带任何异常类型 使用except而带多种异常类型 try-fi ...
- HTML a标签链接 设置点击下载文件
通常情况下,为文件添加链接后,用户可以通过点击链接,直接将文件下载到本地,如下载 excel 表格等 <a href="/user/test/xxxx.excel">点 ...
- WebGL学习笔记(十一):混合和透明
到目前为止我们绘制了不少模型,用到了不少颜色,颜色中有四个分量(RGBA),其中的A分量表示透明度,这个分量目前为止我们还没有真正的用到: A分量,表示的是当前的透明度,如果设定为 0.5 就会半透明 ...
- phpspreadsheet 中文文档(八)读写文件+读取文件
2019年10月11日14:09:40 配置设定 将PhpSpreadsheet文件包含在脚本中之后,但是在实例化Spreadsheet对象或加载工作簿文件之前,可以设置许多配置选项,这些配置选项将影 ...
- EF的 NoTracking 的一些记录
NoTracking官方解释 跟踪与非跟踪查询 跟踪行为可控制 Entity Framework Core 是否将有关实体实例的信息保留在其更改跟踪器中. 如果已跟踪某个实体,则该实体中检测到的任何更 ...
- [转]python file文件操作--内置对象open
python file文件操作--内置对象open 说明: 1. 函数功能打开一个文件,返回一个文件读写对象,然后可以对文件进行相应读写操作. 2. file参数表示的需要打开文件的相对路径(当前 ...
- Windows下编译Redis5.0.5
先去弄Cygwin环境 http://www.cygwin.com/ 下载完成 打开 下一步 下一步 下一步 下一步 下一步,出现一个界面,让你添加地址,你打开官网,选择mirror sites,点击 ...
- 以Unicode(UTF-16 LE)编码保存文本
1. 以二进制方式打开文件,写入BOM头 FILE* pFile = nullptr; _wfopen_s(&pFile, szLogFilePath, L"wb"); / ...