Dockerfile优化

使用多阶段构建

go应用程序

# Build stage
FROM golang:1.16 AS build
WORKDIR /app
COPY . .
RUN go build -o myapp .# Runtime stage
FROM alpine:latest
WORKDIR /root/
COPY --from=build /app/myapp .
CMD ["./myapp"]

Nodejs应用程序

# Build stage
FROM node:14 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build# Runtime stage
FROM node:14-alpine
WORKDIR /app
COPY --from=build /app/package*.json ./
RUN npm install --only=production
COPY --from=build /app/build ./build
CMD ["node", "build/server.js"]

Java应用程序

# Build stage
FROM maven:3.6.3-jdk-11 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn -f pom.xml clean package# Runtime stage
FROM openjdk:11-jre-slim
COPY --from=build /app/target/my-application.jar /usr/app/
WORKDIR /usr/app
EXPOSE 8080
CMD ["java", "-jar", "my-application.jar"]

选择正确的基础镜像

优化 Python 应用程序

FROM python:3.8
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

优化后

FROM python:3.8-slim
COPY . /app
WORKDIR /app
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "app.py"]

将多阶段构建与 Alpine 一起用于 Node.js 应用程序

# Build stage
FROM node:14-alpine AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build# Runtime stage
FROM node:14-alpine
WORKDIR /app
COPY --from=builder /app/build ./build
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "build/index.js"]

最小化层数

合并RUN、ENV指令
删除不必要的文件

FROM node:14
RUN apt-get update && \apt-get install -y curl && \rm -rf /var/lib/apt/lists/* 
WORKDIR /app
COPY package.json .
RUN npm install --production && \npm cache clean --force
COPY . .
CMD ["node", "app.js"]
FROM python:3.8
COPY . .
RUN pip install --no-cache-dir -r requirements.txt && \rm requirements.txt
ENV JAVA_HOME=/opt/jdk1.8.0_241 \CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib \PATH=$PATH:$JAVA_HOME/bin

利用 Docker 忽略文件

Node.js应用程序的示例 .dockerignore 文件

node_modules
npm-debug.log
.DS_Store
.env
.git
.gitignore
README.md
LICENSE
docker-compose.yml
Dockerfile
tests/

.dockerignore 集成到 Python 项目中

*.pyc
*.pyo
*.pyd
__pycache__
.env
.git
.gitignore
README.md
Dockerfile
tests/

优化软件安装

FROM ubuntu:latest
RUN apt-get update && \apt-get install -y curl git vim && \apt-get clean && \rm -rf /var/lib/apt/lists/*
FROM python:3.8-slim
RUN pip install --no-cache-dir flask gunicorn && \find / -type d -name __pycache__ -prune -exec rm -rf {} \;

设置时区

FROM alpine:3.11.5
ENV TZ=Asia/Shanghai
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \&& apk add --no-cache tzdata \&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo "Asia/Shanghai" > /etc/timezone

设置系统语言

FROM alpine:3.11.5
ENV LANG=en_US.UTF-8 \LANGUAGE=en_US.UTF-8RUN apk --no-cache add ca-certificates \ && wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \ && wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-2.29-r0.apk \ && wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-bin-2.29-r0.apk \&& wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-i18n-2.29-r0.apk \&& apk add glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk \&& rm -rf /usr/lib/jvm glibc-2.29-r0.apk glibc-bin-2.29-r0.apk  glibc-i18n-2.29-r0.apk \&& /usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true \&& echo "export LANG=$LANG" > /etc/profile.d/locale.sh \&& apk del glibc-i18n

尽可能使用静态二进制文件

FROM golang:1.16 AS builder
WORKDIR /build
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp .FROM scratch
COPY --from=builder /build/myapp /myapp
CMD ["/myapp"]

使用 BuildKit 压缩镜像层

启用 BuildKit
BuildKit包含在 Docker18.09 及更高版本中,但默认情况下不启用。通过设置 DOCKER_BUILDKIT 环境变量来启用

export DOCKER_BUILDKIT=1
docker build .

或者将 Docker 守护程序配置为默认使用 BuildKit

{ "features": { "buildkit": true } }

使用 BuildKit 优化映像构建

FROM node:14
WORKDIR /app
COPY package.json package-lock.json ./
RUN --mount=type=cache,target=/root/.npm npm ci
COPY . .

挤压镜像层

使用 docker export 和 docker import

docker build -t my-app .
docker container create --name temp-container my-app
docker export temp-container | docker import - my-app:squashed
docker container rm temp-container

使用 Docker Squash 工具

pip install docker-squash
docker save my-app:latest | docker-squash -t my-app:squashed | docker load

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/767206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab 将矩阵写入文件

目录 一、概述1、算法概述2、主要函数二、将矩阵写入到文本文件三、将矩阵写入电子表格文件四、将矩阵写入指定的工作表和范围五、将数据追加到电子表格六、将矩阵数据追加到文本文件七、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此…

Debezium日常分享系列之:Debezium2.5稳定版本之处理常见问题

Debezium日常分享系列之:Debezium2.5稳定版本之处理常见问题 一、配置和启动错误二、MySQL 不可用三、Kafka Connect stops gracefully四、Kafka Connect 进程崩溃五、Kafka变得不可用六、MySQL 清除 binlog 文件七、Debezium技术总结 下面描述 Debezium 如何处理各…

代码随想录阅读笔记-栈与队列【删除字符串中的所有相邻重复项】

题目 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 示例: 输入&am…

了解交互设计:定义、解析及案例演示!

交互设计作为现代设计领域的一个重要分支,对用户体验和产品的成功至关重要。然而,许多人并不了解交互设计的定义和实践方法。本文将深入分析交互设计的概念和重要性,分享精彩的案例,推荐有用的交互设计工具,帮助您创造…

解析SpringBoot自动装配原理前置知识:解析条件注释的原理

什么是自动装配? Spring提供了向Bean中自动注入依赖的这个功能,这个过程就是自动装配。 SpringBoot的自动装配原理基于大量的条件注解ConditionalOnXXX,因此要先来了解一下条件注解相关的源码。 以ConditionalOnClass为例 首先来查看Conditi…

02-MySQL数据库的基本使用与密码设置

一、服务端口 3306端口和33060端口,是我们启动数据库后开启的监听端口; 3306端口:是我们MySQL服务的监听端口,用来连接数据库使用; 33060端口:MySQL-shell服务的端口,MySQL-shell是MySQL架构集群…

Web前端-JS

JavaScript,简称js:负责网页的行为(交互效果)。是一门跨平台,面向对象的脚本语言(编写出来的语言不需要编译,通过浏览器的解释就可以运行) JS引入方式 1.内嵌样式 这样打开页面就会…

关系型数据库mysql(2)SQL语句

目录 一.SQL语句简介 1.1SQL语言 1.2SQL语句分类 1.3SQL分类 1.4SQL 语言规范 二.数据库基本操作 2.1查看数据库中的库信息 2.2查看数据库中的表信息 数据库内查看 数据库外查看 2.3显示数据库的结构(字段) ​编辑 2.4 字段属性 2.5常见的数…

关于Vue项目组件全局注册的一些建议

关于Vue项目组件全局注册的一些建议 在日常的工作中,我们项目中会有些公用的组件,可能有的同学提倡将这些组件全局注册,我个人的建议尽量避免全局注册,当然仁者见仁,智者见智 每个人都有自己想法和思路,下…

解决方案:如何安装neo4j软件

文章目录 一、安装JDK二、安装neo4j 一、安装JDK 第一步先安装JDK,因为neo4j环境需要JDK,过程比较多,截图如下: 安装JDK网址 https://www.oracle.com/java/technologies/downloads winR,输入cmd,再输入j…

Linux V4L2 应用编程

V4L2:Video4Linux2,是 Linux 内核中的一个框架,提供了一套用于视频设备驱动程序开发的 API。它是一个开放的、通用的、模块化的视频设备驱动程序框架,允许 Linux 操作系统和应用程序与各种视频设备(如摄像头、视频采集…

外推蜘蛛池的优势及优势?

源码介绍: 适用使用范围: 外推蜘蛛池、站群 演示地址:以截图为准 运行环境:php 其余注释:什么是蜘蛛池? 蜘蛛池是一个利用大平台权重来获取百度收录和排名的程序。 程序员通常称其为“蜘蛛池”。 这是一个可以快速…

【机器学习300问】41、如果数据集中有少量带有标签,到底是选择异常检测还是有监督学习呢?

一、背景问题 有时候会遇到这样一种情况,构建异常检测系统的时候也使用了少量带标签的数据,既然使用了带标签的数据,那么就和监督学习有点类似,那为什么不用监督学习呢? 二、异常检测任务的特殊性 在构建异常检测系统…

Spring-声明式事务实例(有详细注释)

前提知识 Spring-IOC容器注解方式使用https://blog.csdn.net/m0_61160520/article/details/136784799?spm1001.2014.3001.5501切点表达式https://blog.csdn.net/m0_61160520/article/details/136782885?spm1001.2014.3001.5501 案例 1.创建项目 2.导入依赖 <dependen…

react native 总结

react app.js 相当与vue app.vue import React from react; import ./App.css; import ReactRoute from ./router import {HashRouter as Router,Link} from react-router-dom class App extends React.Component {constructor(props){super(props)}render(){return ( <…

记使用sjson的一次小事故

1. 前言 之前在设计一个兼容函数的时候&#xff0c;使用了sjson动态设入参数&#xff0c;从而实现一些参数的兼容。大致的逻辑如下所示&#xff1a; // 有一堆不规则的json数据 {"a":"aaa","b":"bbb","any_key1":{"k…

Cache缓存:HTTP缓存策略解析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

蓝桥杯每日一题(拓扑排序)

//3696构造有向无环图 有向无环图才有拓扑排序&#xff0c;有环的话不能进行拓扑&#xff0c;因为会导致环中一个结点&#xff08;环的入口位置&#xff09;其入度永远无法变成0。 先判断图是否可拓扑序&#xff0c;如果本来就不能就直接No&#xff0c;可以的话。可以按照拓扑…

为什么元素显示的样式跟我设置的不一样?CSS优先级详解

一、什么是CSS中的选择器优先级&#xff1f; 在CSS中&#xff0c;选择器优先级是指确定应用于元素的最相关CSS声明的算法。这个优先级决定了哪个样式规则将被应用到元素上。根据选择器的类型和特定性&#xff0c;CSS规定了不同的优先级&#xff0c;例如ID选择器比类选择器具有更…

select , poll, epoll思维导图

目录 1. 总的框架结构 2. select 3. poll 4. epoll 1. 总的框架结构 2. select