当前位置: 首页 > 后端技术 > Java

使用Dockerfile自定义镜像

时间:2023-04-01 20:19:38 Java

这里以简单的自定义Nginx镜像为例创建Dockerfile创建Dockerfile$mkdir/usr/local/docker$cd/usr/local/docker$mkdirnginx$cdnginx$viDockerfileDockerfile的内容如下FROMnginxRUNecho'

Hello,Docker!

'>/usr/share/nginx/html/index.html这个Dockerfile很简单,里面只有两行全部的。涉及两条指令,FROM和RUN。FROM指令通常,自定义镜像需要指定一个镜像作为基础,并在其上进行自定义。所以Dockerfile中的FROM是必须的指令,必须是第一条指令。除了选择一个已经存在的镜像作为基础镜像,Docker还存在一个特殊的镜像,叫做scratch。这个形象是一个虚拟的概念,实际上并不存在。它代表一个空白图像。使用这个特殊的镜像意味着它不基于任何操作系统,并且会使镜像变小。Go语言开发的应用很多都会用这种方式来制作图片。FROMscratch...RUN命令RUN命令用于执行命令,是Dockerfile自定义镜像中最常用的命令之一。如果多个RUN命令一起执行:FROMdebian:jessieRUNapt-getupdateRUNapt-getinstall-ygcclibc6-devmakeRUNwget-Oredis.tar.gz"http://download.redis.io/releases/redis-3.2.5.tar.gz"RUNmkdir-p/usr/src/redisRUNtar-xzfredis.tar.gz-C/usr/src/redis--strip-components=1RUNmake-C/usr/src/redisRUNmake-C/usr/src/redisinstall注意:执行Dockerfile中的每条指令都会创建一层文件,但是UnionFS有层数上限。上述Dockerfile的正确写法如下:FROMdebian:jessieRUNbuildDeps='gcclibc6-devmake'\&&apt-getupdate\&&apt-getinstall-y$buildDeps\&&wget-Oredis.tar。gz"http://download.redis.io/releases/redis-3.2.5.tar.gz"\&&mkdir-p/usr/src/redis\&&tar-xzfredis.tar.gz-C/usr/src/redis--strip-components=1\&&make-C/usr/src/redis\&&make-C/usr/src/redisinstall\&&rm-rf/var/lib/apt/lists/*\&&rmredis.tar。gz\&&rm-r/usr/src/redis\&&apt-getpurge-y--auto-remove$buildDeps这样7层文件简化为1层文件。另外,每层建好后要删除不相关的文件,否则镜像会臃肿。要构建镜像,请在Dockerfile文件所在的目录中使用构建命令$dockerbuild-tnginx:v1。构建完成后,执行以下命令$dockerimages,你会发现多了一个名为nginx的镜像,其标签名为v1。其他Dockerfile指令COPY指令一般用于从宿主机拷贝文件到容器COPY例如:COPYpackage.json/usr/src/app/可以是多个甚至一个通配符。例如:COPYhom*/mydir/COPYhom?.txt/mydir/可以是容器中的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用WORKDIR命令指定),target路径不需要提前创建。如果该目录不存在,将在复制文件之前创建缺少的目录。还值得注意的是,使用COPY命令,可以保留有关文件的各种元数据。如读、写、执行权限、文件更改时间等。ADD命令ADD命令本质上与COPY基本相同,只是在COPY的基础上增加了一些功能:比如原路径可以是URL,而下载文件权限默认设置为700,即当前用户可以读、写和执行权限,而usergroups和其他用户没有任何权限。如果下载的文件是压缩包,会自动解压。在COPY和ADD命令之间进行选择时,您可以遵循此原则。所有文件拷贝都使用COPY命令,只有在需要自动解压时才使用ADD更多详细说明参考官方文档Dockerfile官方文档Dockerfile最佳实践文档Docker官方镜像Dockerfile更多干货请前往:https:///antonipeng.com