1.纯干货!吞没源码构建Dockfile镜像的吞没源码十三个最佳实践点
纯干货!构建Dockfile镜像的吞没源码十三个最佳实践点
编写.dockerignore文件
在构建镜像时,Docker需要准备上下文,吞没源码将所有需要的吞没源码文件收集到进程中。默认上下文包含Dockerfile目录中的吞没源码bd沃客源码所有文件,但实际上并不需要.git目录、吞没源码.vscode目录、吞没源码.idea目录等内容。吞没源码.dockerignore文件的吞没源码用法与.gitignore类似,可以忽略一些不需要的吞没源码文件,有效加快构建时间并减少Docker镜像大小。吞没源码
样例:
一个容器只运行单个应用
从技术角度讲,吞没源码可以在Docker容器中运行多个进程,吞没源码但这样做会让你非常痛苦。吞没源码因此,建议为每个应用构建单独的Docker镜像。
选择合适的基础镜像
合适的基础镜像如scratch、busybox、alpine、distroless等,海报模板设计源码有助于减少镜像大小。较小的镜像表示无用程序更少,提高了安全性。
将多个RUN指令合并为一个
Docker镜像是分层的,重要知识点包括:现在,将所有RUN指令合并为一个。同时删除apt-get upgrade,因为它会使镜像构建非常不确定。记住,只能将变化频率相同的结构牛指标源码指令合并在一起,如将node.js安装与npm模块安装放在一起。
基础镜像和生产镜像的标签不要使用latest
当镜像没有指定标签时,默认使用latest。这可能导致镜像更新时构建失败。若确实需要最新版基础镜像,使用latest标签;否则,最好指定明确的镜像标签。
样例:
每个RUN指令后删除多余文件
更新apt-get源后,下载、解压并安装软件包,家装saas源码这些文件在运行应用时不需要保存在Docker镜像中。删除它们可以减少镜像大小。
样例:
在Dockerfile中删除/var/lib/apt/lists/目录中的文件(由apt-get update生成)。
设置WORKDIR和CMD
WORKDIR指令可以设置默认目录,即运行RUN、CMD、ENTRYPOINT指令的地方。CMD指令设置容器创建时执行的默认命令,应将命令写入数组中。
样例:
使用ENTRYPOINT时,java源码查询图解用exec启动命令(可选)
在使用entrypoint的脚本中,要使用exec命令运行应用。不使用exec,容器关闭时SIGTERM信号会被bash脚本进程吞没。exec命令启动的进程可以取代脚本进程,确保所有信号正常工作。
相比ADD,优先使用COPY
COPY指令用于简单文件拷贝,ADD指令则可以下载远程文件和解压压缩包,相对复杂。
样例:
设置默认的环境变量,映射端口和数据卷
运行Docker容器时可能需要环境变量。在Dockerfile中设置默认环境变量。同时,应在Dockerfile中设置映射端口和数据卷。
样例:
ENV指令指定的环境变量在容器中可用。构建镜像时需要指定的变量,使用ARG指令。
使用LABEL设置镜像元数据
使用LABEL指令为镜像设置元数据,例如创建者或描述。弃用了MAINTAINER指令,外部程序如nvidia-docker可能需要com.nvidia.volumes.needed等元数据。
样例:
一个镜像可以有多个label。尽可能将多个label合并到一个LABEL指令中,避免构建出低效镜像。
添加HEALTHCHECK
运行容器时,使用--restart always选项,当容器崩溃时Docker守护进程会重启容器。HEALTHCHECK指令可以周期性检查容器健康状况,指定命令返回0表示正常,返回1表示异常。
样例:
当请求失败时,curl --fail命令返回非0状态。
合理调整COPY和RUN的顺序
应将变化最少的部分放在Dockerfile的前面,充分利用镜像缓存。
样例:
源代码经常变化,每次构建镜像时都需要重新安装NPM模块。因此,先拷贝package.json,然后安装NPM模块,最后拷贝其余源代码。这样即使源代码变化,也不需要重新安装NPM模块。
参考文档