如何從私有儲存庫擷取 Docker 映像,並在 Elastic Beanstalk Docker 平台中使用?

2 分的閱讀內容
0

我想從私有儲存庫中提取 Docker 映像,並在我的 Elastic Beanstalk 平台中使用。

簡短說明

從私有儲存庫中擷取映像時,可能會從 Elastic Beanstalk 執行個體收到下列錯誤:

來自 /var/log/ecs/ecs-agent.log[CannotPullContainerError] 的錯誤訊息 來自 daemon: pull access 的錯誤回應拒絕 {username}/{repo};儲存庫不存在或者請求 require 'docker login': 遭拒:請求存取資源遭拒 module=docker_client.go

當私有註冊表和 Elastic Beanstalk 之間有驗證差距時,就會發生這個錯誤。若要使用私有儲存庫中的映像時,Elastic Beanstalk 必須向託管私有儲存庫的線上註冊表進行驗證。它必須先進行驗證,然後才能從私有儲存庫擷取和部署映像。有兩個選項可擷取和儲存 Elastic Beanstalk 環境的認證,以便向私有儲存庫進行驗證:

  • AWS Systems Manager (SSM) 參數存放區
  • Dockerrun.aws.json 檔案

解決方法

若要使用 Dockerrun.aws.json 檔案從私有儲存庫擷取 Docker 映像檔,請完成以下步驟:

  1. 產生有效的身分驗證權杖
  2. 建立 Amazon Simple Storage Service (Amazon S3) 儲存貯體並存放驗證檔案
  3. 建立 Dockerrun.aws.json v2 檔案

產生有效的身分驗證權杖

**注意:**如果執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確定您執行的是最新版本的 AWS CLI

  1. 執行以下命令,在您的機器上安裝 Docker:

    $ brew install docker
  2. dockerhub 建立一個帳戶。

  3. 建立儲存庫並將影像傳輸至儲存庫。

  4. 執行 Docker login 命令:

    $ Docker login
  5. 使用以下命令,建立一個名為 credentials.env 的檔案:

    $ vi credentials.env
  6. 將下列憑證新增至先前建立的檔案:

    注意:確保將所有範例字串替換為您指定的值,然後儲存文件並退出編輯器模式。

    DOCKER_USERNAME=example-user-name
    DOCKER_PASSWORD=example-password
    DOCKER_REGISTRY=https://index.docker.io/v1/
  7. 執行下列命令:

    docker run -it --rm \
    -env-file=credentials.env \
    v "$(pwd):/opt/data/" \
    v "/var/run/docker.sock:/var/run/docker.sock" \
    codeship/dockercfg-generator /opt/data/dockercfg
  8. 擷取 .dockercfg 檔案:

    $ cat  /opt/data/dockercfg

    範例輸出:

    {
    "https://index.docker.io/v1/ ": {
    "auth": '**************************AMTE="     
    },
    "HttpHeaders": {
    "User-Agent": "Docker-Client/18.03.1-ce (linux)"
    }
    }

    **注意:**請確定將 dockercfg 檔案包含在應用程式來源套件。

建立 Amazon S3 儲存貯體並存放驗證檔案

建立一個安全的 Amazon S3 儲存貯體並傳輸 .dockercfg檔案至儲存貯體。請確定下列事項:

  • Amazon S3 儲存貯體託管在與使用該儲存貯體的環境相同的 AWS 區域中。Elastic Beanstalk 無法從託管在其他區域的 Amazon S3 儲存貯體下載檔案。
  • 執行個體設定檔中的 AWS 身分和 Access Management (IAM) 角色會被授與 s****3:GetObject 操作權限。

建立 Dockerrun.aws.json v2 檔案

透過執行下列命令建立 Docker Run.aws.json v2 檔案,並在 authentication 參數下新增 Amazon S3 儲存貯體資訊:

  • 針對 bucket 參數,請新增您的 Amazon S3 儲存貯體資訊。
  • 針對 image 參數,請將您的映像名稱與標籤一起加入。這可以從您的 dockerhub 帳戶中擷取。
{
"AWSEBDockerrunVersion": 2,  
"authentication": {    
"bucket": "example-bucket-name",    
"key": ".dockercfg"  
},  
"volumes": [    
{      
"name": "php-app",      
"host": {        
"sourcePath": "/var/app/current/php-app"      
}    
},    
{      
"name": "nginx-proxy-conf",      
"host": {        
"sourcePath": "/var/app/current/proxy/conf.d"      
}    
}  
],  
"containerDefinitions": [    
{      
"name": "php-app",      
"image": "example-image-name",      
"essential": true,      
"memory": 128,      
"mountPoints": [        
{          
"sourceVolume": "php-app",          
"containerPath": "/var/www/html",          
"readOnly": true        
},        
{          
"sourceVolume": "awseb-logs-php-app",          
"containerPath": "/var/log/sample-app"        
}      
]    
},    
{      
"name": "nginx-proxy",      
"image": "nginx",      
"essential": true,      
"memory": 128,      
"portMappings": [        
{          
"hostPort": 80,          
"containerPort": 80        
}      
],      
"links": [        
"php-app"      
],      
"mountPoints": [        
{          
"sourceVolume":"php-app",          
"containerPath": "/var/www/html",          
"readOnly": true        
},        
{          
"sourceVolume": "awseb-logs-nginx-proxy",          
"containerPath": "/var/log/nginx"        
},        
{          
"sourceVolume": "nginx-proxy-conf",          
"containerPath": "/etc/nginx/conf.d",          
"readOnly": true        
}      
]    
}  
]
}

**注意:**上述指令可讓您的 Elastic Beanstalk 執行個體成功透過線上註冊表進行驗證。

相關資訊

使用私有儲存庫中的映像

從 AWS Elastic Beanstalk 存取私有 Docker 映像檔

AWS 官方
AWS 官方已更新 10 個月前