加入收藏 | 设为首页 | 会员中心 | 我要投稿 淮南站长网 (https://www.0554zz.cn/)- 管理运维、图像技术、智能营销、专属主机、5G!
当前位置: 首页 > 站长资讯 > 评论 > 正文

想禁用Windows Defender?

发布时间:2021-02-15 16:55:39 所属栏目:评论 来源:互联网
导读:我们可以看到镜像由以前的 104MB 变成了 28.2MB,大大降低了镜像的大

我们可以看到镜像由以前的 104MB 变成了 28.2MB,大大降低了镜像的大小。

注意:在 Linux 下面我们可以使用 ldd 工具来查找指定的二进制文件所需要的依赖,比如 $ ldd $(which redis-server) 。

使用 distroless 镜像来降低 Docker 镜像的大小是一个非常有效的方法,但是这样做也有一个明显的缺点就是最终的镜像中没有 shell 程序了,使得调试 Docker 容器就非常非常困难,当然这样也降低了应用被攻击的危险,使其更加安全,如果我们将应用部署到 Kubernetes 集群的话,我们可以利用 kubectl-debug这样的工具来辅助调试应用。

Alpine Linux

另外一种比较常见的方式是选择在 Alpine Linux 基础上构建应用镜像,Alpine Linux 是一个特别适合创建最小化 Docker 镜像的发行版。Apline Linux 使用较小的 musl C 库代替 glibc,并将其静态链接,这意味着针对 musl 编译的程序将变成可重定位的 (relocatable)的二进制文件,从而无需包含共享对象,从而可以显著降低镜像的大小。

redis:alpine 镜像大概为 30MB 左右,这样做的缺点是,通常 musl 的性能不如 glibc。当然也有另外一个好处,那就是和上面的 distroless 相比,Alpine 是成熟的 Linux 发行版,提供基本的 shell 访问,使得调试 Docker 容器应用更为方便。在 Docker Hub 上面也可以找到几乎所有流行软件的 Alpine 版本,比如 Redis、Nginx、MySQL 等等。

 

手动管理

我们能够直接想到的方法就是直接修改官方的 Redis 镜像 Dockerfile 文件,手动删除容器运行后不需要的组件,然后重新构建一个新镜像。这种方法理论上是可行的,但是容易出错,而且效果也不是特别明显。主要是不能和官方的镜像实时同步。

多阶段构建

Docker 在17.05 版本起提供了多阶段构建的功能来解决这个问题,这种方法是通过丢弃中间层来实现的,并通过中间层来提供有关如何创建最终镜像及其内容信息来完成的,只需要保留容器化应用所需的组件即可。在更上层的实现如下所示:

  • 以一些镜像作为构建的基础
  • 和平常一样运行命令来构造你的应用
  • 将所需的制品复制到另外一个单独的镜像

Distroless

在严重依赖容器化技术,尤其是 Docker 之后,谷歌早就意识到了使用臃肿镜像的弊端。所以他们提供了自己的方法来解决这个问题,即 distroless 镜像。与典型的Linux 基础镜像(绑定了很多软件)不同,在 distroless 上对你的应用进行 docker化,最终的镜像只包含应用及其运行时的依赖项,大多数 Linux 发行版中包含的标准软件,如包管理器,甚至 shell 都被会被排除在外。同样的,要使用 Google 的 distroless 镜像,需要使用上面我们提到的多阶段构建,如下所示:

 

这样做的好处至少有两点:一是没有引入新的 void 类型和关键字;二是不需要程序员在函数前声明返回类型,这就跟有显式返回值的写法保持了一致。

试想一下,如果 Python 不让函数默认有返回值的话,就可能要写成 void def func():... 这样的形式,那它就变成了函数定义时的一种特例。与另一种特例函数相比,即异步函数asyc def func():... ,就可能引起混乱。

总体而言,Python 似乎认为 void 空类型不是那么有存在的必要,似乎 NoneType 类型就足够了,而当缺少返回值时,让解释器统一注入是极为方便的,因此才出现了我们看到的现状。

至此,文章标题的问题算是圆满回答了。

最后,让我们开始进入 ending 吧:本文明面上是以“Python 为什么没有 void 关键字”为切入点,然而,它实际上瞄准的却是“Python 为什么需要返回 None”的问题。


 

(编辑:淮南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读