Dockerfile 为镜像的描述文件 是一个包含用于组合镜像的命令文本文档,是一个脚本文件
通过读取 Dockerfile 中的指令,按步骤自动生成镜像
docker build -t 机构/镜像名<:tags> Dockerfile目录
其实在 Docker命令 已经使用过了 Dockerfile 如下图所示:
FROM 镜像:标签
:基准镜像名称与标签FROM scratch
:不依赖任何基准镜像MAINTAINER 机构描述
:维护机构WORKDIR 目录名称
:切换工作目录相当于 cd
命令,如果工作目录不存在,会自动创建,尽量使用绝对路径ADD 源文件地址 复制的目标地址
:将指定的文件或目录复制到镜像的指定目录下,如果指定目录不存在,会自动创建目录,ADD test /
复制到根路径下,ADD test.gz /
复制后还会对文件进行解压LABEL
:其它的描述信息,不会产生功能影响,起方便阅读作用,是你自己想要在里面定义的一些信息,可以去写到 label
当中,例如 LABEL version = "1.0"
,LABEL description = "描述信息"
ENV
:设置环境常量,可以提高程序的维护性例如,ENV JAVA_HOME /use/local/openjdk11
,RUN ${JAVA_HOME}/bin/java -jar test.jar
RUN yum install -y vim
RUN ["yum", "install", "-y", "vim"]
pid
不变build
构建时执行命令Dockfile
中出现 多个cmd
,只有 最后一个
才会被执行CMD ["ps", "-ef"]
ENTRYPOINT
会被执行ENTRYPOINT
一定会被执行,如果有多个只会执行最后一个ENTRYPOINT ["ps"]
我在 Linux 中的 usr/local
目录当中进行演示,首先创建一个目录如下
mkdir docker-run
进入到刚刚创建好了 docker-run 目录当中在输入如下命令创建 Dockerfile 文件
vim Dockerfile
然后加入如下内容
FROM ubuntu:latest
RUN ["echo", "hello-run"]
CMD ["echo", "hello-cmd"]
ENTRYPOINT ["echo", "hello-entrypoint"]
如上准备工作完毕之后就可以开始构建镜像了输入如下命令开始构建,注意不能直接输入 .
如果直接输入 .
就成了虚悬镜像了
docker build -t it6666/ubuntu:1.0 .
然后在紧接着以该镜像启动一个容器出来查看效果如下图所示,命令如下,镜像的完整形式应该是镜像的名称加上 TAG 的版本号如下
docker run it6666/ubuntu:1.0
如上的内容其实也演示了一下 CMD 与 ENTRYPOINT 两个结合使用的结果,当两个进行结合使用的时候加了参数之后,后面的 CMD 它就和把加入的参数信息,来去当作是 ENTRYPOINT 的参数使用如下图所示
如上看了两个进行结合使用的效果我们在将 ENTRYPOINT 去掉来看看 CMD 的效果,经过如上介绍 如果容器启动时,在启动后添加了命令,则 Dockfile 中添加的 cmd 指定会被忽略
,首先编辑 Dockerfile 文件删除 ENTRYPOINT 这一行内容保存并退出
重新构建镜像 2.0
docker build -t it6666/ubuntu:2.0 .
发现了一个问题,在构建的过程当中发现它使用了缓存的内容,这就是要介绍的一个内容,在构建的过程当中如果该命令已经之前执行过了会放入缓存,下一次在进行执行的时候就会直接去使用缓存当中的,如下
构建完毕之后我们在来验证如上所说的那一点内容,如果没有 ENTRYPOINT
,在执行时,输入的命令会直接执行如下
Layer
是按顺序构成的,最底层的 Layer
是基础镜像(base image)最上层是最终镜像(final image)产生了一个临时容器,该容器只用于构建,不能直接使用
Step3...
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。