通过dockerfile编译docker镜像(构建镜像的最佳实践)
通过dockerfile编译docker镜像(构建镜像的最佳实践)(本文由闻数起舞翻译自Hari Nelakurthi的文章《Dockerfile : Best practices for building an image》,转载请注明出处,原文链接:https://medium.com/swlh/dockerfile-best-practices-for-building-an-image-6120e512b1fa)RUN apt-get update RUN apt-get install -y python3-pip RUN cd ~ # Can be converted to RUN apt-get update && apt-get install -y python3-pip && cd ~当然,围绕建立镜像的正确方法讨论了更多。镜像架构,多级构建,秘密管理和镜像大小都可以拥有专用故事。如果您有兴趣进入更深的官方文件,有一些链接以下良好做法
您本月有2个免费会员的故事。注册中等并获得额外的
> Photo : trackmetal from Pixabay
在过去几年中,通过社区和企业内的Docker通过了令人难以置信的。我们如何不喜欢一项技术为我们带来更多稳定性,更好地控制解决方案,并且通常需要更少的时间来部署在服务器上的相同应用程序?当Devops工程师正在设计CI / CD系统时,它肯定是容器如此受欢迎的原因。
创建镜像的灵活性是一个好的资产,但需要被一些指导和良好做法所面向。为什么 ?主要用于对抗容器的大小,谁可以影响性能和安全漏洞,还用于提高重新可用性,可读性和可维护性。
以下良好做法列表主要来自我作为不同公司Devops专家工作的个人经验。它不是特定的顺序,他们都是为了理解和应用的重要性。
- OS基础镜像:OS基础镜像可以对镜像的大小和安全漏洞产生大的影响。使用像高级基础镜像(如〜5 MB),与Ubuntu(〜188 MB)这样的标准基础镜像一起使用,这是一个很好的做法。可以手动添加工具以满足您的需求。
- 基础镜像:操作系统基础镜像和最终镜像之间的基础镜像需要正确地设计,以便具有良好的可用性和可维护性。每个人都需要具有特定目标并且尽可能通用,以便被其他图像重用。对于微服务,镜像架构可以如下:(1)OS基础镜像(2)中间件镜像(3)工具镜像(4)应用镜像 我们可以在这种情况下重用具有相同前3个基础图像需要。
- 定义具有最小权限的用户:我们在Dockerfile中创建的用户需要遵循与创建Linux用户时的相同的好实践。他们应该只有需要的特权,不再是。root用户不应该用于启动容器以获得显而易见的原因,并且由于每次创建的镜像,它是一个好主意在dockerfile中更改。
- 利用.dockerignore:.dockerignore文件在构建构建图像中构建图像时,从上下文中排除。在CI / CD系统中建立多次应用时,这种优化非常适合。
- 与添加或复制特定:仅选择文件夹和/或文件可能需要一段时间,但它是优化图像大小并减少安全漏洞的简单方法。
- 特定标记而不是固定标签:标记是特定镜像版本的别名。标记周围最大的混乱之一是“最新”标记。它在理论上用于最新的镜像版本,但由于它手动管理,我们无法保证它真的是这种情况。也许维护者以自己的方式管理最新标记或者只是忘记更新标记。此外,使用像“最新”的固定标签意味着镜像版本可以更改,因此重建镜像可以带来一些副作用。建议使用像镜像版本的特定标记。当您准备好适当的生命周期管理时,此版本升级。
- 镜像生命周期管理:如果您在镜像的已弃用版本上,可能会发生安全漏洞。适当的生命周期管理需要在团队中定义,以便在必要时验证和更新镜像版本。它可以总结为:谁负责?频率是多少?
- 敏感信息:环境变量不是管理秘密的好解决方案,因为(1)没有加密,并且(2)检索数据的容易程度。对管理秘密的市场存在的解决方案,其中很少是为Kubernetes设计的。一个例子是hashicorp vault和它们的架构是因为管理秘密,但也处理了保管库连接。由于仅用Base64编码,因此需要避免Kubernetes秘密。不使用加密方法。
- 多级构建:Docker v17.05中引入的多级构建功能在暗示工具/文件的图像构建时,在构建图像时,可以非常有用。在ententpoint中运行的实际进程不需要这些工具或文件。按示例,使用Maven的Java MicroService可以在Dockerfile中直接添加构建工件的步骤。它很棒但无需保留像Maven或临时文件这样的工具,只需要所产生的伪像。从Dockerfile中基本上多级的多级构建创建了只有在最新的文件中导入所需的可能性。见示例1
- combine命令:dockerfile中的每个命令都会向图像添加一层。通过组合命令,我们在减少层数和一种方法时减小图像的大小。最简单的示例是运行命令。而不是拥有多个运行命令,每个指令都可以组合并由“&&”分隔。见例2
示例1:多级构建
FROM 3.6.3-jdk-11
COPY src ~/app/src
COPY pom.xml ~/app
RUN mvn clean install -f ~/app/pom.xml
FROM openjdk:11-jre-slim
COPY — from=0 ~/app/target/ARTIFACT-1.0.0-SNAPSHOT.jar /SOME/FOLDER/ARTIFACT-1.0.0-SNAPSHOT.jar
EXPOSE 8080
ENTRYPOINT [“java” ”-jar” ”/SOME/FOLDER/ARTIFACT-1.0.0-SNAPSHOT.jar”]
示例2:组合运行命令
RUN apt-get update
RUN apt-get install -y python3-pip
RUN cd ~
# Can be converted to
RUN apt-get update && apt-get install -y python3-pip && cd ~
当然,围绕建立镜像的正确方法讨论了更多。镜像架构,多级构建,秘密管理和镜像大小都可以拥有专用故事。如果您有兴趣进入更深的官方文件,有一些链接
- 多级构建:https://docs.docker.com/develop/develop-images/multistage-build/
- 最佳实践:https://docs.docker.com/develop/dev-best-practics/
(本文由闻数起舞翻译自Hari Nelakurthi的文章《Dockerfile : Best practices for building an image》,转载请注明出处,原文链接:https://medium.com/swlh/dockerfile-best-practices-for-building-an-image-6120e512b1fa)