【问题标题】:How to stop `gcloud component update` from keeping a backup?如何阻止`gcloud component update`保留备份?
【发布时间】:2020-07-04 18:23:19
【问题描述】:

我正在构建一个 google-cloud-sdk 基础映像,并且我正在努力使其保持精简。

ARG GCLOUD_SDK_VERSION=285.0.1-alpine
FROM google/cloud-sdk:$GCLOUD_SDK_VERSION

# Install Java 8 for Datastore emulator
RUN apk add --update --no-cache \
        openjdk8-jre
RUN gcloud components install \
        cloud-datastore-emulator \
        pubsub-emulator \
        beta \
        --quiet
...

到目前为止一切都很好。当我构建并查看gcloud components install 命令的输出时,我感到很自信:

┌──────────────────────────────────────────────────┐
│       These components will be installed.        │
├──────────────────────────┬────────────┬──────────┤
│           Name           │  Version   │   Size   │
├──────────────────────────┼────────────┼──────────┤
│ Cloud Datastore Emulator │      2.1.0 │ 18.4 MiB │
│ Cloud Pub/Sub Emulator   │ 2019.09.27 │ 34.9 MiB │
│ gcloud Beta Commands     │ 2019.05.17 │  < 1 MiB │
└──────────────────────────┴────────────┴──────────┘

然而,我的最终图像大小令人震惊:1.11GB。当我查看 docker 历史记录时,我发现组件安装实际上为最终图像大小贡献了 654MB:

CREATED BY                                      SIZE
/bin/sh -c gcloud components install        …   654MB
/bin/sh -c apk add --update --no-cache      …   78.2MB

我目前假设它与安装过程的最后一行有关。

╔════════════════════════════════════════════════════════════╗
╠═ Creating backup and activating new installation          ═╣
╚════════════════════════════════════════════════════════════╝

在您的本地工作站上似乎是一件好事,但在 docker 映像中却没有。我试图查看是否可以停用此备份或之后将其删除。手册页中没有任何有用的段落,在线搜索总是将我引导到一些可以使用 gcloud 命令启动的云数据库备份过程。

有人对这里发生的事情有进一步的了解吗?也许导致大部分开销的根本不是备份?

【问题讨论】:

    标签: docker google-cloud-platform gcloud


    【解决方案1】:

    首先,我建议您运行命令 gcloud components list,以获取可用且当前安装在您的 SDK 中的组件的完整列表 - 这样,您应该能够检查哪个组件获得了这么大的尺寸在您的安装上。

    除此之外,如文档Installing the Cloud SDK Docker image中所述:

    Cloud SDK Docker 镜像本质上是安装在基于 Debian 的操作系统镜像之上的 Cloud SDK。

    这意味着可能部分大小与用于安装的操作系统有关。

    我还想让您知道,在创建 docker 映像期间不可能不创建备份。

    出于这个原因,可能值得直接联系 Google,通过提出 Feature Request,以便在将来进行检查 - 更好地控制组件,例如备份, 因为图片不要那么大。

    如果这些信息对您有帮助,请告诉我!

    【讨论】:

    • 感谢您的回复。安装后我打电话给gcloud components list。它基本上与安装过程中的内容相同。 Datastore 模拟器仅 18.4 MiB,Pubsub 模拟器仅 34.9 MiB。没有其他值得注意的。我会调查你提到的其他几点。并回到这篇文章。
    • 好的,在分析安装组件前后的安装时,我发现 (a) 700MB 确实来自 gcloud 安装文件夹和 (b) 之后还有一些剩余的 __pycache__ 文件夹。删除文件夹后,图像的整体大小减少了 100MB。
    • 我刚刚在 gcloud 安装文件夹的根目录下找到了一个.install 文件夹(du -s ./* 不显示隐藏文件)。这个 .install 文件夹隐藏了大约 280 MB。瞧,.install 文件夹中有一个 .backup 文件夹,其中大部分是 280 MB。我需要测试我是否可以删除此文件夹并仍然正常运行所有内容。
    【解决方案2】:

    首先我要感谢@gso_gabriel 的建议。我最终在调用gcloud components install 之前和之后分析了文件系统利用率。

    1. 事实证明,删除备份很容易。在 gcloud 应用程序文件夹中,有一个隐藏的 .install/.backup 文件夹,一开始是不存在的,组件安装后占用了大约 270 MB。
    2. 安装组件还会留下一堆 __pycache__ 文件夹,总大小约为 100 MB。

    为了减小整体图像大小,我将相应的 docker 行更新为:

    RUN gcloud components install \
            cloud-datastore-emulator \
            pubsub-emulator \
            beta \
            --quiet \
        && rm -rf $(find google-cloud-sdk/ -regex ".*/__pycache__") \
        && rm -rf google-cloud-sdk/.install/.backup
    

    使用docker history可以看到改进:

    CREATED BY                                      SIZE
    /bin/sh -c gcloud components install        …   317MB
    

    减少了超过 300 MB。我通过将图像用作我的一个应用程序的数据存储和 pubsub 服务来测试图像,并运行它的单元测试。一切似乎仍然运行良好。

    可能还有更多可以清理的文件,但我相信我已经得到了重量级的文件。

    【讨论】:

    • 感谢@Felix 提供您的调查结果!很高兴听到我也可以帮助你!
    • Alpine 包括非核心组件,例如rm -rf /google-cloud-sdk/bin/anthoscli 又减少了 70MB
    • 这太好了,谢谢。尽管这些__pycache__ 文件是否需要在运行时重新生成,从而减慢它们的使用速度?
    • @Maximilian 是的,在启动过程中可能需要更多时间。好点子。如果快速启动很重要,那么最好将它们留在那里。因为我的用例没有这个限制,所以我想要更干净的图像。
    【解决方案3】:

    答案有点晚,但我最终做的是修改 google/cloud-sdk:alpine Dockerfile 并添加来自 debian_component_based Dockerfile 的代码来安装我想要的组件以及您的修复程序。这导致 docker 镜像只包含我需要的组件,同时比 gcloud/cloud-sdk:alpine 镜像更小。

    例子:

    RUN apk --no-cache add \
            curl \
            python3 \
            py3-crcmod \
            bash \
            libc6-compat \
            openssh-client \
            git \
            gnupg \
        && curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \
        tar xzf google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \
        rm google-cloud-sdk-${CLOUD_SDK_VERSION}-linux-x86_64.tar.gz && \
        /google-cloud-sdk/install.sh --bash-completion=false --path-update=true --usage-reporting=false \
        --additional-components alpha && rm -rf $(find google-cloud-sdk/ -regex ".*/__pycache__") \
        && rm -rf google-cloud-sdk/.install/.backup
    

    生成的图像大小为 424 MB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-24
      • 2014-08-29
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 2019-05-31
      相关资源
      最近更新 更多