在谷歌云上,使用docker构建rust项目的速度非常慢

在谷歌云上,使用docker构建rust项目的速度非常慢,docker,google-cloud-platform,rust,continuous-integration,Docker,Google Cloud Platform,Rust,Continuous Integration,我对生锈还比较陌生,但我一直在Docker容器内进行一个项目。下面是我的dockerfile,它工作得很好。我的构建使用一个中间容器来构建主项目之前的所有货物容器。除非我更新依赖项,否则项目将在本地快速构建。即使重建了依赖关系,在我的旧MacBookPro上最多也只需要10分钟 FROM ekidd/rust-musl-builder as builder WORKDIR /home/rust/ # Avoid having to install/build all dependencies

我对生锈还比较陌生,但我一直在Docker容器内进行一个项目。下面是我的dockerfile,它工作得很好。我的构建使用一个中间容器来构建主项目之前的所有货物容器。除非我更新依赖项,否则项目将在本地快速构建。即使重建了依赖关系,在我的旧MacBookPro上最多也只需要10分钟

FROM ekidd/rust-musl-builder as builder

WORKDIR /home/rust/

# Avoid having to install/build all dependencies by copying
# the Cargo files and making a dummy src/main.rs
COPY Cargo.toml .
COPY Cargo.lock .
RUN echo "fn main() {}" > src/main.rs
RUN cargo test
RUN cargo build --release

# We need to touch our real main.rs file or else docker will use
# the cached one.
COPY . .
RUN sudo touch src/main.rs

RUN cargo test
RUN cargo build --release

# Size optimization
RUN strip target/x86_64-unknown-linux-musl/release/project-name

# Start building the final image
FROM scratch
WORKDIR /home/rust/
COPY --from=builder /home/rust/target/x86_64-unknown-linux-musl/release/project-name .
ENTRYPOINT ["./project-name"]
然而,当我将我的项目设置为通过google cloud build从github repo自动构建时,我震惊地发现构建几乎需要45分钟!我想,如果我为中间容器正确设置了缓存,至少可以节省一些时间。即使构建器成功地提取了缓存的映像,但它似乎没有使用它,并且总是从头开始构建中介容器。这是我的cloudbuild.yaml:

steps:
  - name: gcr.io/cloud-builders/docker
    args:
      - "-c"
      - >-
        docker pull $_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:latest
        || exit 0
    id: Pull
    entrypoint: bash
  - name: gcr.io/cloud-builders/docker
    args:
      - build
      - "-t"
      - "$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:latest"
      - "--cache-from"
      - "$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:latest"
      - .
      - "-f"
      - Dockerfile
    id: Build
  - name: gcr.io/cloud-builders/docker
    args:
      - push
      - "$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:latest"
    id: Push
  - name: gcr.io/google.com/cloudsdktool/cloud-sdk
    args:
      - run
      - services
      - update
      - $_SERVICE_NAME
      - "--platform=managed"
      - "--image=$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:latest"
      - >-
        --labels=managed-by=gcp-cloud-build-deploy-cloud-run,commit-sha=$COMMIT_SHA,gcb-build-id=$BUILD_ID,gcb-trigger-id=$_TRIGGER_ID,$_LABELS
      - "--region=$_DEPLOY_REGION"
      - "--quiet"
    id: Deploy
    entrypoint: gcloud
timeout: 3600s
images:
  - "$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:latest"
options:
  substitutionOption: ALLOW_LOOSE

我正在寻找任何关于我在cloudbuild.yaml中做错了什么的信息,以及如何加速我的云构建的技巧,因为它在本地速度非常快。理想情况下,我想坚持使用谷歌云,但如果有另一个CI服务处理锈蚀/ DOCKER构建更好,我将打开开关。

速度方面有2件事要考虑:

  • 在你的(甚至是旧的)macbook pro上

    • 您有多核超线程CPU
    • 在turbo模式下,CPU最高可达3.5Ghz
  • 云上构建

    • 每个生成只有一个vCPU(默认情况下)
    • vCPU是“服务器设计的CPU”:没有高端性能,但性能稳定一致,约为2.1Ghz(在turbo模式下略高)
因此,性能的差异是明显的。要加快构建速度,我建议您使用:


应该更好

这就是我在Google Cloud build上改进构建时生锈项目所做的。这不是一个完美的解决方案,但总比没有好:

  • 类似于Docker文件中的更改,以为DEP和我自己的源创建不同的缓存层

  • 使用kaniko利用缓存(这似乎是您的特殊问题)

步骤:
-名称:“gcr.io/kaniko项目/执行人:最新”
args:
---destination=eu.gcr.io/$PROJECT\u ID/$REPO\u NAME:$COMMIT\u SHA
---缓存=真
---缓存ttl=96h
超时时间:2400s
文件:

  • 将机器类型更改为更高的选项,在我的情况下:
选项:
machineType:'E2\u高CPU\u 8'

<强>小心,更改机器类型会影响预算,所以你应该考虑这是否值得你的特定项目。


如果您经常推动您的更改,效果会好得多,但仍然不够诚实。

谢谢!我很欣赏这个答案,我肯定会尝试一下,但云构建的核心问题不是使用中间容器,而是每次从头开始构建,这是我最关心的问题。初始构建时间现在减少到10分钟,重建时间减少到3分钟。尽管生成过程说有一个奇怪的错误,但似乎工作正常。下面是错误:
error:在执行生成步骤后找不到一个或多个映像:
@iicaptain,我自己没有。可能您在步骤中推送了两次图像,使用kaniko,>“Cloud Build会在构建容器图像层时将其直接上载到注册表,因此没有明确的推送步骤”。
...
...
options:
  substitutionOption: ALLOW_LOOSE
  machineType: 'E2_HIGHCPU_8'