Dockerfile 解析与制作
Dockerfile 解析与制作
Author: huyikai
Dockerfile 解析
FROM
:基础镜像,当前镜像是基于哪个镜像的,必须为 Dockerfile 的第一个指令
MAINTAINER
:镜像维护者的姓名和邮箱地址 (已过时,推荐使用 LABEL)
LABEL
:为镜像指定标签
RUN
:容器构建时需要运行的指令
EXPOSE
:指定当前容器与外界交互的端口
WORKDIR
:创建容器后终端默认登录进来的工作目录,一个落脚点
ENV
:用来在构建镜像过程中设置环境变量
ADD
:将本地文件添加到容器中,会自动处理 url 网络资源和 解压 tar 类型文件(网络压缩资源不会被解压)
COPY
:与类似 ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置,但是不会自动解压文件,也不能访问网络资源
VOLUME
:容器数据卷,用于数据保存和持久化工作
CMD
:指定一个容器启动时要运行的指令。Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数给替换
ENTRYPOINT
:指定一个容器启动时要运行的指令。ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数,不同点是 docker run 之后的参数会被当做参数传递给 ENTRYPOINT,形成新的命令组合
ONBUILD
:当构建一个被继承的 Dockerfile 时,该指令将被运行,即父镜像在被子继承后,父镜像的 onbuild 将会被触发
USER
:指定容器运行时的用户名或 UID,后续的 RUN 也会使用指定用户。使用 USER 指定用户时,可以使用用户名、UID 或 GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
dockerfile 样例
镜像制作
方式一:通过 Dockerfile 使用 docker build 指令生成镜像
宿主机资源文件路径
:指的是 Dockerfile 文件中使用 ADD 或者 COPY 指令添加的宿主机资源文件路径,例如:上文 Dockerfile 文件中的ADD nginx-1.8.0.tar.gz /usr/local/
命令,则宿主机资源文件路径指的是nginx-1.8.0.tar.gz
资源文件在宿主机中的路径
举例:如果上文中添加的nginx-1.8.0.tar.gz
资源文件在宿主机中的/root/resources
路径下,与 Dockerfile 文件不在同一路径下,则命令后的宿主机资源文件路径为/root/resources
。如果添加的资源文件与 Dockerfile 文件在同一路径下,则可以使用相对路径.
方式二:通过使用 docker commit 指令生成镜像
慎用 docker commit
使用 docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。如果使用 docker commit 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。