Mengonfigurasi update image dasar otomatis

Mengonfigurasi update image dasar otomatis untuk Cloud Run memungkinkan Google membuat patch keamanan pada komponen runtime bahasa dan sistem operasi image dasar secara otomatis. Anda tidak perlu mem-build ulang atau men-deploy ulang layanan agar image dasar diupdate. Tidak ada revisi baru yang dibuat saat image dasar diperbarui.

Diagram berikut menunjukkan cara kode aplikasi dan dependensi ("image aplikasi") ditumpuk di atas runtime bahasa, paket OS, dan Sistem Operasi ("image dasar"). Komponen image dasar diperbarui secara otomatis oleh Google.

Diagram image dasar Cloud Run

Untuk mengonfigurasi pembaruan image dasar otomatis, lakukan tindakan berikut:

  • Pilih image dasar Cloud Run yang kompatibel.
  • Build dan deploy image aplikasi Anda dengan cara yang mempertahankan kemampuan untuk memindahkan basis layanan yang berjalan dengan aman.

Memilih Image Dasar

Image dasar adalah titik awal untuk sebagian besar alur kerja pengembangan berbasis container. Developer memulai dengan image dasar dan menambahkan lapisan di atasnya, yaitu library, biner, dan file konfigurasi yang diperlukan untuk menjalankan aplikasi mereka.

Buildpack Google Cloud memublikasikan dan mengelola image dasar untuk mem-build aplikasi Serverless. Image dasar ini dibuat di atas distribusi Linux Ubuntu.

Cloud Run hanya mendukung image dasar otomatis yang menggunakan image dasar buildpack Google Cloud.

Anda harus mempertimbangkan hal-hal berikut saat memilih buildpack Google Cloud:

  • Stack: Stack terdiri dari versi distribusi Linux dan paket sistem, seperti OpenSSL dan curl
  • Language: Versi bahasa pemrograman tertentu yang digunakan oleh aplikasi Anda

Tinjau image dasar runtime untuk mempelajari lebih lanjut variasi image dasar.

Mem-build image aplikasi

Layanan dengan update otomatis yang diaktifkan harus menyediakan image aplikasi yang menghilangkan lapisan sistem operasi dasar. Ada dua cara untuk melakukannya:

Men-deploy dari sumber

Anda dapat menggunakan fitur deploy from source Cloud Run untuk mem-build dan men-deploy kode sehingga layanan Anda kompatibel dengan menerima update otomatis. Untuk melakukannya, Anda harus menyediakan flag --base-image saat membuat aplikasi.

Misalnya, untuk men-deploy layanan atau fungsi Node.js dengan update image dasar otomatis yang diaktifkan, Anda akan menggunakan perintah berikut:

gcloud beta run deploy \
  --source . \
  --base-image nodejs20

Build di scratch

Anda juga dapat menggunakan toolchain build untuk membuat image penampung aplikasi yang kompatibel dengan update image dasar otomatis.

Saat Anda men-deploy layanan Cloud Run dengan update image dasar otomatis, image container aplikasi Anda akan ditumpuk di atas image container dasar. Image container aplikasi hanya boleh menyertakan aplikasi Anda, bukan sistem operasi atau runtime, yang disediakan dalam image container dasar.

Untuk membuat image penampung aplikasi, lakukan hal berikut:

  1. Buat Dockerfile multi-tahap yang:
    1. Mem-build aplikasi menggunakan image dasar yang sesuai dengan dependensi yang diperlukan.
    2. Menyalin komponen yang di-build ke image awal.
  2. Build image container aplikasi dan kirim ke Artifact Registry.
  3. Deploy image container aplikasi ke Cloud Run dan tentukan image dasar.

Membuat Dockerfile multi-tahap

Kita akan menggunakan aplikasi Node.js untuk panduan ini. Panduan ini tidak khusus bahasa, dan dapat disesuaikan untuk aplikasi dan bahasa Anda.

  • Buat Dockerfile di direktori utama project kita dengan hal berikut:

    # This Dockerfile will produce an image that only includes the Node.js app and *not* the Node.js runtime.
    # The resulting image will not run locally. It is intented at being layered on top of a Node.js base image.
    
    FROM node:20-slim as builder
    
    # Create and change to the app directory.
    WORKDIR /usr/src/app
    
    # Copy application dependency manifests to the container image and install
    # production dependencies.
    COPY package*.json ./
    RUN npm install --only=production
    
    # Copy local code to the container image.
    COPY . ./
    
    # Copy the application source code and depenencies onto a scratch image.
    FROM scratch
    WORKDIR /workspace
    COPY --from=builder --chown=33:33 /usr/src/app/ ./
    
    # Run the web service on container startup.
    CMD [ "node", "index.js" ]
    

Dockerfile ini menggunakan build multi-tahap untuk menyalin kode sumber dan dependensi aplikasi ke image scratch yang menghilangkan sistem operasi, paket, dan komponen runtime yang akan disediakan saat runtime oleh image dasar yang dikelola Cloud Run.

Mem-build image aplikasi

Build image aplikasi Anda dan upload ke Artifact Registry. Lihat mem-build container untuk mengetahui detail tentang cara mem-build Dockerfile dengan Cloud Build dan menguploadnya ke Artifact Registry.

Men-deploy image aplikasi

Sekarang Anda siap men-deploy image aplikasi dengan mengaktifkan update otomatis menggunakan image dasar yang paling kompatibel untuk aplikasi Anda. Kita akan menggunakan runtime Node.js 20 dari us-central1 untuk contoh ini. Tinjau image dasar runtime untuk mempelajari lebih lanjut variasi image dasar.

Lihat men-deploy image container ke Cloud Run untuk mengetahui detail tambahan tentang peran dan izin yang diperlukan.

gcloud

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Untuk mengaktifkan update otomatis untuk runtime Node.js 20 saat men-deploy image aplikasi, jalankan perintah berikut:

    gcloud beta run deploy SERVICE \
    --image APP_IMAGE \
    --base-image BASE_IMAGE

    Ganti:

    • SERVICE dengan nama layanan yang ingin Anda deploy.
    • APP_IMAGE dengan URL image container aplikasi Anda.
    • BASE_IMAGE dengan URL image dasar Anda, misalnya nodejs20 atau us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20 Tinjau Image dasar runtime untuk mempelajari variasi image dasar lebih lanjut.

YAML

  1. Jika Anda membuat layanan baru, lewati langkah ini. Jika Anda mengupdate layanan yang sudah ada, download konfigurasi YAML-nya:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Perbarui runtimeClassName dan anotasi run.googleapis.com/base-images:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
    name: SERVICE
    annotations:
      ...
      run.googleapis.com/launch-stage: BETA
      ...
    spec:
    template:
      metadata:
        annotations:
          run.googleapis.com/base-images: '{"NAME":"BASE_IMAGE"}'
        spec:
          containers:
          - name: NAME
            image: APP_IMAGE
          runtimeClassName: run.googleapis.com/linux-base-image-update

    Ganti:

    • SERVICE dengan nama layanan yang ingin Anda deploy.
    • APP_IMAGE dengan URL image container aplikasi Anda.
    • BASE_IMAGE dengan URL image dasar Anda, misalnya us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20. Tinjau Image dasar runtime untuk mempelajari lebih lanjut variasi image dasar.

Merakit ulang image container untuk dijalankan secara lokal

Image container aplikasi yang digunakan dengan update image dasar otomatis di-build di scratch dan tidak dapat dijalankan di luar Cloud Run dengan update image dasar diaktifkan. Anda dapat membuat image aplikasi dapat dijalankan dengan membuat ulang image aplikasi di atas image dasar yang kompatibel.

  1. Instal Docker Community Edition (CE) di workstation Anda.

  2. Download image aplikasi:

    docker pull APP_IMAGE
    

    Ganti:

    • APP_IMAGE dengan URL image container Anda.
  3. Download image dasar:

    docker pull BASE_IMAGE
    

    Ganti:

    • BASE_IMAGE dengan URL image dasar yang kompatibel. Daftar image dasar yang tersedia dapat ditemukan di image dasar buildpack Google Cloud. Misalnya, jika Anda membuat aplikasi Node.JS 20 menggunakan stack google-22, Anda akan memilih us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs20:latest.
  4. Susun ulang gambar:

    Gunakan Dockerfile untuk menyalin semua file dari image aplikasi kembali ke image dasar:

    ARG APP_IMAGE
    ARG NEW_BASE_IMAGE
    
    # first copy all files from the app image onto the builder image
    FROM ${APP_IMAGE} AS app
    FROM ${NEW_BASE_IMAGE} AS builder
    COPY --from=app / /
    
    # restore the app image config by copying everything from previous step back
    # back onto the app image
    FROM ${APP_IMAGE}
    COPY --from=builder / /
    

    Buat gambar:

    docker build \
        -t IMAGE \
        --build-arg APP_IMAGE=APP_IMAGE \
        --build-arg NEW_BASE_IMAGE=BASE_IMAGE \
        .
    

    Ganti:

    • IMAGE dengan nama image yang disusun ulang.

    Jika Anda melihat peringatan bahwa ARG ${APP_IMAGE} dan ARG ${NEW_BASE_IMAGE} bukan image dasar yang valid, Anda dapat mengabaikannya dengan aman dan menjalankan image:

    docker run -p 8080:8080 IMAGE
    

Menonaktifkan update otomatis

Saat men-deploy dari sumber

Saat men-deploy dari sumber, Anda dapat menonaktifkan update gambar dasar otomatis menggunakan flag --no-automatic-updates. Contoh berikut menunjukkan cara menonaktifkan update image dasar otomatis untuk layanan Node.js:

gcloud

gcloud beta run deploy SERVICE \
    --source . \
    --base-image nodejs20 \
    --no-automatic-updates

Saat men-deploy image container

Untuk menonaktifkan update image dasar bagi layanan yang menggunakan image container yang dibuat dari awal, Anda harus men-deploy image container baru yang menyertakan image dasar dan menghapus image dasar:

gcloud

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Untuk menonaktifkan update image dasar otomatis, jalankan perintah berikut:

    gcloud beta run deploy SERVICE \
        --image IMAGE \
        --base-image ""

    Ganti:

    • SERVICE dengan nama layanan yang ingin Anda deploy.
    • IMAGE dengan URL image container Anda yang berisi aplikasi, runtime, dan OS.

YAML

  1. Jika Anda membuat layanan baru, lewati langkah ini. Jika Anda mengupdate layanan yang sudah ada, download konfigurasi YAML-nya:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Hapus anotasi run.googleapis.com/base-images.

  3. Hapus atribut runtimeClassName.

  4. Di image, pastikan untuk menggunakan image container yang menyertakan aplikasi, runtime, dan OS.

  5. Buat atau perbarui layanan menggunakan perintah berikut:

    gcloud run services replace service.yaml

Batasan umum

  • Update image dasar otomatis hanya mendukung image dasar buildpack Google Cloud. Anda tidak dapat menggunakan image dasar Anda sendiri.

  • Aplikasi yang menggunakan bahasa yang dikompilasi tidak akan dikompilasi ulang sebagai hasil dari update image dasar otomatis.

  • Pemindaian keamanan pada image aplikasi Anda mungkin tidak lengkap. Karena image aplikasi Anda sekarang dibuat di scratch, pemindai keamanan hanya akan memindai bagian aplikasi dari image Anda. Untuk mendapatkan gambaran yang lebih lengkap tentang keamanan penampung, Anda juga harus menjalankan pemindaian pada image dasar yang sesuai yang disediakan Google. Anda dapat mendownload image dasar dan menggunakan alat open source untuk menjalankan pemindaian.