אינטראקציה עם תמונות Docker Hub

אתם יכולים להשתמש בקובצי אימג' של קונטיינרים מ-Docker Hub כדי להריץ את המשימות שלכם ב-Cloud Build. בנוסף, אם תהליך הבנייה יוצר תמונות, אפשר להעלות אותן ל-Docker Hub. בדף הזה מוסבר איך לכתוב קובצי הגדרות של build כדי לדחוף ולמשוך תמונות של Docker Hub. סקירה כללית של כל השדות שזמינים בקובץ הגדרות build מופיעה במאמר סקירה כללית של הגדרות build.

שליפת תמונות ציבוריות מ-Docker Hub

אפשר למשוך תמונות Docker רשמיות, תמונות שאושרו על ידי Docker ותמונות מותאמות אישית שמאוחסנות ב-Docker Hub בשלב הבנייה, על ידי ציון שם התמונה בשדה name. קודם Cloud Build ימשוך את קובץ האימג' שצוין מ-Docker Hub, ואז ישתמש בו כדי להריץ את שלב ה-build.

בדוגמה שלמטה, Cloud Build מושך את קובץ האימג' של Docker עבור maven כדי להריץ את הפקודה mvn שצוינה ב-args:

YAML

steps:
- name: "maven"
  args: ["mvn", "--version"]

JSON

{
   "steps": [
      {
         "name": "maven",
         "args": [
            "mvn",
            "--version"
         ]
      }
   ]
}

אחסון פרטי כניסה של Docker ב-Secret Manager

כדי למשוך קובצי אימג' פרטיים ולדחוף קובצי אימג' ציבוריים ופרטיים ל-Docker Hub,‏ Cloud Build צריך לבצע אימות ל-Docker באמצעות פרטי הכניסה שלכם. כדי לכלול פרטי כניסה של Docker ב-builds, קודם צריך לאחסן את פרטי הכניסה ב-Secret Manager, ואז להעניק ל-Cloud Build הרשאה לגשת לסוד מ-Secret Manager.

כדי לאחסן פרטי כניסה של Docker ב-Secret Manager:

  1. נכנסים לדף Secret Manager במסוף Google Cloud :

    מעבר לדף Secret Manager

  2. בדף Secret Manager, לוחצים על Create Secret (יצירת סוד).

  3. בדף יצירת Secret, בשדה שם, מזינים docker-username.

  4. בשדה Secret value (ערך סודי), מזינים את שם המשתמש שלכם ב-Docker.

  5. משאירים את הקטע אזורים ללא שינוי.

  6. לוחצים על הלחצן Create secret.

חוזרים על השלבים שלמעלה כדי לאחסן את הסיסמה של Docker ב-Secret Manager.

כדי להעניק לחשבון השירות שבו אתם משתמשים לבנייה את תפקיד ה-IAM‏ Secret Manager Secret Accessor (גישה לסודות ב-Secret Manager):

  1. פותחים את הדף Secret Manager במסוף Google Cloud :

    מעבר לדף Secret Manager

  2. מסמנים את התיבה של הסוד שמתאים לשם המשתמש והסיסמה שלכם ב-Docker.

  3. אם החלונית לא פתוחה, לוחצים על Show info panel כדי לפתוח אותה.

  4. בחלונית, בקטע Permissions, לוחצים על Add principal.

  5. בשדה New principals, מזינים את כתובת האימייל של חשבון השירות.

  6. בתפריט הנפתח Select a role, בוחרים בתפקיד Secret Manager Secret Accessor.

  7. לוחצים על Save.

שליפת תמונות פרטיות מ-Docker Hub

כדי לשלוף תמונות פרטיות מ-Docker Hub:

  1. חשוב לוודא שאחסנתם את פרטי הכניסה של Docker ב-Secret Manager ונתתם ל-Cloud Build הרשאות גישה לסוד.

  2. בקובץ תצורת ה-build:

    • אחרי כל ה-build steps, מוסיפים שדה availableSecrets שמציין את גרסת הסוד ואת משתנה הסביבה של שם המשתמש והסיסמה ב-Docker.
    • בשלב ה-build שבו רוצים לציין את שם המשתמש והסיסמה:
      • כדי להשתמש בכלי bash בשלב build, מוסיפים שדה entrypoint שמפנה אל bash. הפעולה הזו נדרשת כדי להתייחס למשתנה הסביבה של הסוד.
      • מוסיפים שדה secretEnv שמציין את משתנה הסביבה של שם המשתמש והסיסמה.
      • בשדה args, מוסיפים את הדגל -c כארגומנט הראשון. כל מחרוזת שמעבירים אחרי ‎-c נחשבת לפקודה. מידע נוסף על הפעלת פקודות bash עם ‎-c זמין במסמכי התיעוד של bash.
      • כשמציינים את הסוד בשדה args, צריך לציין אותו באמצעות משתנה הסביבה עם הקידומת $$.

    The following build config file shows how to login to Docker using the Docker username and password stored in Secret Manager, and run a private image.

    YAML

     steps:
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
       secretEnv: ['USERNAME', 'PASSWORD']
     - name: "gcr.io/cloud-builders/docker"
       entrypoint: 'bash'
       args: ['-c', 'docker run $$USERNAME/REPOSITORY:TAG']
       secretEnv: ['USERNAME']
     availableSecrets:
       secretManager:
       - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
         env: 'PASSWORD'
       - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
         env: 'USERNAME'
    
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker run $$USERNAME/REPOSITORY:TAG"
         ],
         "secretEnv": [
          "USERNAME"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    Replace the placeholder values in the above commands with the following:

    • PROJECT_ID: The ID of the Google Cloud project where you've stored your secrets.
    • DOCKER_USERNAME_SECRET_NAME: The secret name corresponding to your Docker username.
    • DOCKER_USERNAME_SECRET_VERSION: The secret version of your Docker username.
    • DOCKER_PASSWORD_SECRET_NAME: The secret name corresponding to your Docker password.
    • DOCKER_PASSWORD_SECRET_VERSION: The secret version of your Docker password.
    • REPOSITORY: The name of your Docker repository from where you're pulling the image.
    • TAG: The tag name of your image.
  3. Use the build config file to manually start a build or to automate builds using triggers.

Pushing images to Docker Hub

To push public and private images to Docker Hub:

  1. Make sure you've stored your Docker credentials in Secret Manager and granted permissions for Cloud Build to access the secret.

  2. In the build config file:

    • After all the build steps, add an availableSecrets field specifying the secret version and the env variable for the Docker username and password.
    • In the build step where you want to specify the username and password:
      • Add an entrypoint field pointing to bash to use the bash tool in the build step. This is required to refer to the environment variable for the secret.
      • Add a secretEnv field specifying the environment variable for username and password.
      • In the args field, add a -c flag as the first argument. Any string you pass after -c is treated as a command. For more information on running bash commands with -c, see the bash documentation.
      • When specifying the secret in the args field, specify it using the environment variable prefixed with $$.

    The following example build config file shows how to login to Docker, build an image with source code stored locally, and then push the image to Docker repository.

    YAML

     steps:
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
       secretEnv: ['USERNAME', 'PASSWORD']
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker build -t $$USERNAME/REPOSITORY:TAG .']
       secretEnv: ['USERNAME']
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker push $$USERNAME/REPOSITORY:TAG']
       secretEnv: ['USERNAME']
     availableSecrets:
       secretManager:
       - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
         env: 'PASSWORD'
       - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
         env: 'USERNAME'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker build -t $$USERNAME/REPOSITORY:TAG ."
         ],
         "secretEnv": [
          "USERNAME"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker push $$USERNAME/REPOSITORY:TAG"
         ],
         "secretEnv": [
          "USERNAME"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    מחליפים את ערכי ה-placeholder בפקודות שלמעלה בערכים הבאים:

    • PROJECT_ID: מזהה Google Cloud הפרויקט שבו מאוחסנים הסודות.
    • DOCKER_USERNAME_SECRET_NAME: שם הסוד שמתאים לשם המשתמש שלכם ב-Docker.
    • DOCKER_USERNAME_SECRET_VERSION: הגרסה הסודית של שם המשתמש שלכם ב-Docker.
    • DOCKER_PASSWORD_SECRET_NAME: השם הסודי שמתאים לסיסמה שלכם ב-Docker.
    • DOCKER_PASSWORD_SECRET_VERSION: גרסת הסוד של הסיסמה שלכם ל-Docker.
    • REPOSITORY: השם של המאגר ב-Docker שאליו אתם מעלים את האימג'.
    • TAG: שם התג של התמונה.
  3. אפשר להשתמש בקובץ ההגדרות של ה-build כדי להתחיל build באופן ידני או כדי ליצור אוטומציה של build באמצעות טריגרים.

עבודה עם גרסאות של לקוח Docker

כלי ה-Docker Builder הנתמך ב-Cloud Build,‏ gcr.io/cloud-builders/docker, משתמש ב-Docker 20.10.14. בגרסה הזו, אם לא מציינים תג כשמעלים תמונה ל-Docker, ‏ Docker מעלה רק את התמונה עם התג latest. אם התג latest לא קיים, הפעולה של שליחת הנתונים תיכשל.

כדי להעביר בדחיפה תמונה עם תג ספציפי ל-Docker, מציינים את התג בdocker push שלב הבנייה. בדוגמה הבאה מתבצעת העלאה של תמונה עם התג prod:

YAML

steps:
...
- name: 'gcr.io/cloud-builders/docker'
  args: ['docker', 'push', '$$USERNAME/myrepo:prod']
...

JSON

{
  ...
  {
    "name": "gcr.io/cloud-builders/docker",
    "args": [
      "docker",
      "push", 
      "$$USERNAME/myrepo:prod"
      ],
  }
  ...
}

כדי להעביר בדחיפה את כל התגים של תמונה ל-Docker, מוסיפים את הדגל -a לרשימת הארגומנטים בשלב הבנייה docker push:

YAML

steps:
...
- name: 'gcr.io/cloud-builders/docker'
  args: ['docker', 'push', '-a', '$$USERNAME/myrepo']
...

JSON

{
  ...
  {
    "name": "gcr.io/cloud-builders/docker",
    "args": [
      "docker",
      "push",
      "-a",
      "$$USERNAME/myrepo"
      ],
  }
  ...
}

אפשר להשתמש בלקוח Docker 19.03.9 על ידי תיוג הגרסה ב-Docker Builder:

YAML

steps:
...
- name: 'gcr.io/cloud-builders/docker:19.03.9'
  args: ['docker', 'push', '$$USERNAME/myrepo:prod']
...

JSON

{
  ...
  {
    "name": "gcr.io/cloud-builders/docker:19.03.9",
    "args": [
      "docker",
      "push",
      "$$USERNAME/myrepo:prod"
      ],
  }
  ...
}

המאמרים הבאים