Esempi Docker per CodeBuild - AWS CodeBuild

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Esempi Docker per CodeBuild

Docker in un esempio di immagine personalizzato per CodeBuild

Questo esempio crea ed esegue un'immagine Docker utilizzando AWS CodeBuild un'immagine di build Docker personalizzata (docker:dindin Docker Hub).

Per scoprire come creare un'immagine Docker utilizzando invece un'immagine di build fornita CodeBuild con il supporto Docker, consulta la nostra. Pubblica l'immagine Docker in un esempio di archivio di immagini Amazon ECR

Importante

L'esecuzione di questo esempio potrebbe comportare addebiti sul tuo AWS account. Questi includono eventuali addebiti per CodeBuild e per AWS risorse e azioni relative ad Amazon S3 e AWS KMS CloudWatch Logs. Per ulteriori informazioni, consulta CodeBuild i prezzi, i prezzi di Amazon S3, i prezzi e AWS Key Management Service i prezzi di Amazon CloudWatch.

Esecuzione dell'esempio

Per eseguire questo esempio
  1. Crea i file come descritto nelle sezioni «Struttura delle directory» e «File» di questo argomento, quindi caricali in un bucket di input S3 o in un repository AWS CodeCommit GitHub, o Bitbucket.

    Importante

    Non caricare (root directory name), ma solo i file all'interno di (root directory name)

    Se si sta utilizzando un bucket di input S3, assicurarsi di creare un file ZIP contenente i file, quindi caricarlo nel bucket di input. Non aggiungere (root directory name) al file ZIP, ma solo i file all'interno di (root directory name)

  2. Crea un progetto di compilazione, esegui la build e visualizza le relative informazioni sulla build.

    Se usi il AWS CLI per creare il progetto di compilazione, l'input in formato JSON del create-project comando potrebbe avere un aspetto simile a questo. (Sostituire i segnaposto con i propri valori).

    { "name": "sample-docker-custom-image-project", "source": { "type": "S3", "location": "codebuild-region-ID-account-ID-input-bucket/DockerCustomImageSample.zip" }, "artifacts": { "type": "NO_ARTIFACTS" }, "environment": { "type": "LINUX_CONTAINER", "image": "docker:dind", "computeType": "BUILD_GENERAL1_SMALL", "privilegedMode": false }, "serviceRole": "arn:aws:iam::account-ID:role/role-name", "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID" }
    Nota

    Per impostazione predefinita, il daemon Docker è abilitato per le build non VPC. Se desideri utilizzare i contenitori Docker per le build VPC, consulta Runtime Privilege e Linux Capabilities sul sito Web di Docker Docs e abilita la modalità privilegiata. Inoltre, Windows non supporta la modalità privilegiata.

  3. Per vedere i risultati della compilazione, cercare la stringa Hello, World! nel log di compilazione. Per ulteriori informazioni, consulta Visualizzazione dei dettagli delle compilazioni.

Struttura delle directory

Questo esempio assume la seguente struttura delle directory.

(root directory name) ├── buildspec.yml └── Dockerfile

File

L'immagine di base del sistema operativo utilizzata in questo esempio è di Ubuntu. L'esempio utilizza i seguenti file.

buildspec.yml (in (root directory name))

version: 0.2 phases: pre_build: commands: - docker build -t helloworld . build: commands: - docker images - docker run helloworld echo "Hello, World!"

Dockerfile (in (root directory name))

FROM maven:3.3.9-jdk-8 RUN echo "Hello World"

Risorse correlate

Pubblica l'immagine Docker in un esempio di repository di immagini di Amazon Elastic Container Registry per CodeBuild

Questo esempio produce come output di build un'immagine Docker e quindi invia l'immagine Docker a un repository di immagini Amazon Elastic Container Registry (Amazon ECR). Questo esempio può essere modificato per inviare l'immagine Docker a Docker Hub. Per ulteriori informazioni, consulta Adattamento dell'esempio per eseguire il push dell'immagine in Docker Hub.

Per imparare a compilare un'immagine Docker utilizzando un'immagine Docker di compilazione personalizzata, (docker:dind in Docker Hub), consulta Docker in un esempio di immagine personalizzata.

Questo esempio è stato testato sulla base di golang:1.12.

Questo esempio utilizza la nuova funzione di compilazioni Docker a più fasi, che produce un'immagine Docker come output della compilazione. Quindi invia l'immagine Docker a un repository di immagini Amazon ECR. Le compilazioni di immagini Docker a più fasi aiutano a ridurre la dimensione dell'immagine Docker finale. Per ulteriori informazioni, consultare la pagina relativa all'utilizzo di compilazioni a più fasi con Docker.

Importante

L'esecuzione di questo esempio potrebbe comportare addebiti sul tuo account. AWS Questi includono possibili addebiti per AWS CodeBuild e per AWS risorse e azioni relative ad Amazon S3 AWS KMS, CloudWatch Logs e Amazon ECR. Per ulteriori informazioni, consulta CodeBuild i prezzi, i prezzi di Amazon S3, i prezzi, i AWS Key Management Service prezzi di Amazon e CloudWatch i prezzi di Amazon Elastic Container Registry.

Esecuzione dell'esempio

Per eseguire questo esempio
  1. Se disponi già di un repository di immagini in Amazon ECR che desideri utilizzare, vai al passaggio 3. Altrimenti, se utilizzi un utente anziché un account AWS root o un utente amministratore per lavorare con Amazon ECR, aggiungi questa istruzione (tra ### BEGIN ADDING STATEMENT HERE ### e ### END ADDING STATEMENT HERE ###) all'utente (o al gruppo IAM a cui l'utente è associato). L'utilizzo di un account AWS root non è consigliato. Questa istruzione consente la creazione di repository Amazon ECR per l'archiviazione di immagini Docker. Le ellissi (...) vengono utilizzate per brevità e per aiutare i clienti a individuare il punto in cui aggiungere l'istruzione. Non rimuovere nessuna istruzione e non digitare queste ellissi nella policy. Per ulteriori informazioni, consulta Working with inline policies using the in the user Guide. AWS Management Console

    { "Statement": [ ### BEGIN ADDING STATEMENT HERE ### { "Action": [ "ecr:CreateRepository" ], "Resource": "*", "Effect": "Allow" }, ### END ADDING STATEMENT HERE ### ... ], "Version": "2012-10-17" }
    Nota

    L'entità IAM che modifica questa policy deve avere l'autorizzazione in IAM a modificare le policy.

  2. Crea un archivio di immagini in Amazon ECR. Assicurati di creare il repository nella stessa AWS regione in cui crei l'ambiente di compilazione ed esegui la build. Per ulteriori informazioni, consulta Creazione di un repository nella Amazon ECR User Guide. Il nome di questo repository deve essere uguale a quello che viene specificato più avanti in questa procedura, rappresentato dalla variabile di ambiente IMAGE_REPO_NAME. Assicurati che la policy del repository Amazon ECR conceda l'accesso tramite push alle immagini per il tuo ruolo IAM di CodeBuild servizio.

  3. Aggiungi questa dichiarazione (tra ### BEGIN ADDING STATEMENT HERE ### e ### END ADDING STATEMENT HERE ###) alla policy che hai allegato al tuo ruolo di servizio. AWS CodeBuild Questa dichiarazione consente di CodeBuild caricare immagini Docker negli archivi Amazon ECR. Le ellissi (...) vengono utilizzate per brevità e per aiutare i clienti a individuare il punto in cui aggiungere l'istruzione. Non rimuovere nessuna istruzione e non digitare queste ellissi nella policy.

    { "Statement": [ ### BEGIN ADDING STATEMENT HERE ### { "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:CompleteLayerUpload", "ecr:GetAuthorizationToken", "ecr:InitiateLayerUpload", "ecr:PutImage", "ecr:UploadLayerPart" ], "Resource": "*", "Effect": "Allow" }, ### END ADDING STATEMENT HERE ### ... ], "Version": "2012-10-17" }
    Nota

    L'entità IAM che modifica questa policy deve avere l'autorizzazione in IAM per modificare le policy.

  4. Crea i file come descritto nelle sezioni «Struttura delle directory» e «File» di questo argomento, quindi caricali in un bucket di input S3 o in un repository AWS CodeCommit GitHub, o Bitbucket. Per ulteriori informazioni, consulta il riferimento al file delle definizioni delle immagini nella Guida per l'utente.AWS CodePipeline

    Importante

    Non caricare (root directory name), ma solo i file all'interno di (root directory name)

    Se si sta utilizzando un bucket di input S3, assicurarsi di creare un file ZIP contenente i file, quindi caricarlo nel bucket di input. Non aggiungere (root directory name) al file ZIP, ma solo i file all'interno di (root directory name)

  5. Crea un progetto di compilazione, esegui la build e visualizza le informazioni sulla build.

    Se utilizzi la console per creare il progetto:

    1. In Operating system (Sistema operativo), seleziona Ubuntu.

    2. In Runtime, seleziona Standard.

    3. Per Immagine, scegli aws/codebuild/standard:5.0.

    4. Aggiungere le seguenti variabili di ambiente:

      • AWS_DEFAULT_REGION con un valore di region-ID

      • AWS_ACCOUNT_ID con un valore di account-ID

      • IMAGE_TAG con un valore di Latest

      • IMAGE_REPO_NAME con un valore di Amazon-ECR-repo-name

    Se usi il AWS CLI per creare il progetto di compilazione, l'input in formato JSON del create-project comando potrebbe avere un aspetto simile a questo. (Sostituire i segnaposto con i propri valori).

    { "name": "sample-docker-project", "source": { "type": "S3", "location": "codebuild-region-ID-account-ID-input-bucket/DockerSample.zip" }, "artifacts": { "type": "NO_ARTIFACTS" }, "environment": { "type": "LINUX_CONTAINER", "image": "aws/codebuild/standard:5.0", "computeType": "BUILD_GENERAL1_SMALL", "environmentVariables": [ { "name": "AWS_DEFAULT_REGION", "value": "region-ID" }, { "name": "AWS_ACCOUNT_ID", "value": "account-ID" }, { "name": "IMAGE_REPO_NAME", "value": "Amazon-ECR-repo-name" }, { "name": "IMAGE_TAG", "value": "latest" } ], }, "serviceRole": "arn:aws:iam::account-ID:role/role-name", "encryptionKey": "arn:aws:kms:region-ID:account-ID:key/key-ID" }
  6. Conferma di aver CodeBuild inviato correttamente l'immagine Docker al repository:

    1. Apri la console Amazon ECR all'indirizzo https://console.aws.amazon.com/ecr/.

    2. Selezionare il nome del repository L'immagine deve essere elencata nella colonna Tag immagine.

Struttura delle directory

Questo esempio assume la seguente struttura delle directory.

(root directory name) ├── buildspec.yml └── Dockerfile

File

Questo esempio utilizza i seguenti file.

buildspec.yml (in (root directory name))

version: 0.2 phases: pre_build: commands: - echo Logging in to Amazon ECR... - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com build: commands: - echo Build started on `date` - echo Building the Docker image... - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker image... - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG

Dockerfile (in (root directory name))

FROM golang:1.12-alpine AS build #Install git RUN apk add --no-cache git #Get the hello world package from a GitHub repository RUN go get github.com/golang/example/hello WORKDIR /go/src/github.com/golang/example/hello # Build the project and send the output to /bin/HelloWorld RUN go build -o /bin/HelloWorld FROM golang:1.12-alpine #Copy the build's output binary from the previous build container COPY --from=build /bin/HelloWorld /bin/HelloWorld ENTRYPOINT ["/bin/HelloWorld"]
Nota

CodeBuild sovrascrive le immagini Docker personalizzateENTRYPOINT.

Adattamento dell'esempio per eseguire il push dell'immagine in Docker Hub

Per inviare l'immagine Docker a Docker Hub anziché ad Amazon ECR, modifica il codice di questo esempio.

Nota

Se si utilizza una versione di Docker precedente alla 17.06, rimuovere l'opzione --no-include-email.

  1. Sostituisci queste righe di codice specifiche di Amazon ECRS nel buildspec.yml file:

    ... pre_build: commands: - echo Logging in to Amazon ECR... - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com build: commands: - echo Build started on `date` - echo Building the Docker image... - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker image... - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG ...

    con queste righe di codice specifiche di Docker Hub:

    ... pre_build: commands: - echo Logging in to Docker Hub... # Type the command to log in to your Docker Hub account here. build: commands: - echo Build started on `date` - echo Building the Docker image... - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $IMAGE_REPO_NAME:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker image... - docker push $IMAGE_REPO_NAME:$IMAGE_TAG ...
  2. Carica il codice modificato in un bucket di input S3 o in un repository AWS CodeCommit GitHub, o Bitbucket.

    Importante

    Non caricare (root directory name), ma solo i file all'interno di (root directory name)

    Se si sta utilizzando un bucket di input S3, assicurarsi di creare un file ZIP contenente i file, quindi caricarlo nel bucket di input. Non aggiungere (root directory name) al file ZIP, ma solo i file all'interno di (root directory name)

  3. Sostituire queste righe di codice dall'input in formato JSON al comando create-project:

    ... "environmentVariables": [ { "name": "AWS_DEFAULT_REGION", "value": "region-ID" }, { "name": "AWS_ACCOUNT_ID", "value": "account-ID" }, { "name": "IMAGE_REPO_NAME", "value": "Amazon-ECR-repo-name" }, { "name": "IMAGE_TAG", "value": "latest" } ] ...

    con queste righe di codice:

    ... "environmentVariables": [ { "name": "IMAGE_REPO_NAME", "value": "your-Docker-Hub-repo-name" }, { "name": "IMAGE_TAG", "value": "latest" } ] ...
  4. Crea un ambiente di compilazione, esegui la build e visualizza le informazioni relative alla build.

  5. Conferma di AWS CodeBuild aver inviato correttamente l'immagine Docker al repository. Accedere a Docker Hub, andare nel repository e selezionare la scheda Tags (Tag). Il tag latest dovrebbe contenere un valore di Last Updated (Ultimo aggiornamento) molto recente.

Risorse correlate

Registro privato con AWS Secrets Manager esempio per CodeBuild

Questo esempio mostra come utilizzare un'immagine Docker archiviata in un registro privato come ambiente AWS CodeBuild di runtime. Le credenziali del registro privato sono archiviate in AWS Secrets Manager. Qualsiasi registro privato funziona con CodeBuild. Questo esempio si basa su Docker Hub.

Nota

I segreti sono visibili alle azioni e non vengono mascherati quando vengono scritti su un file.

Requisiti per un esempio di registro privato

Per utilizzare un registro privato con AWS CodeBuild, è necessario disporre di quanto segue:

  • Un segreto di Secrets Manager che memorizza le credenziali del Docker Hub. Le credenziali vengono utilizzate per accedere al repository privato.

    Nota

    Ti verranno addebitati i segreti che crei.

  • Un repository o un account privato.

  • Una policy IAM relativa ai ruoli di CodeBuild servizio che concede l'accesso al segreto di Secrets Manager.

Segui questi passaggi per creare queste risorse e quindi creare un progetto di CodeBuild compilazione utilizzando le immagini Docker archiviate nel tuo registro privato.

Crea un CodeBuild progetto con un registro privato

  1. Per informazioni su come creare un repository privato gratuito, consulta la pagina relativa ai repository su Docker Hub. Puoi anche eseguire i seguenti comandi in un terminale per estrarre un'immagine, ottenerne l'ID e inserirla in un nuovo repository.

    docker pull amazonlinux docker images amazonlinux --format {{.ID}} docker tag image-id your-username/repository-name:tag docker login docker push your-username/repository-name
  2. Segui la procedura descritta in Creare un AWS Secrets Manager segreto nella Guida AWS Secrets Manager per l'utente.

    1. Nel passaggio 3, in Scegli il tipo di segreto, scegli Altro tipo di segreto.

    2. Nelle coppie chiave/valore, crea una coppia chiave-valore per il nome utente di Docker Hub e una coppia chiave-valore per la password di Docker Hub.

    3. Continua a seguire la procedura descritta in Creare un segreto. AWS Secrets Manager

    4. Nel passaggio 5, nella pagina Configura rotazione automatica, disattivala perché le chiavi corrispondono alle credenziali del tuo Docker Hub.

    5. Completa la procedura descritta in Creare un AWS Secrets Manager segreto.

    Per ulteriori informazioni, consulta What is AWS Secrets Manager?

  3. Quando crei un AWS CodeBuild progetto nella console, CodeBuild assegna l'autorizzazione richiesta. Se si utilizza una AWS KMS chiave diversa daDefaultEncryptionKey, è necessario aggiungerla al ruolo di servizio. Per ulteriori informazioni, consulta Modificare un ruolo (console) nella Guida per l'utente IAM.

    Affinché il ruolo di servizio funzioni con Secrets Manager, deve disporre almeno dell'secretsmanager:GetSecretValueautorizzazione.

  4. Per utilizzare la console per la creazione di un progetto in un ambiente archiviato in un registro privato, esegui la seguente procedura durante l'operazione. Per informazioni, consulta Creare un progetto di compilazione (console).

    Nota

    Se il registro privato si trova nel tuo VPC, deve disporre di un accesso pubblico a Internet. CodeBuild non è possibile estrarre un'immagine da un indirizzo IP privato in un VPC.

    1. In Immagine dell'ambiente, scegli Immagine personalizzata.

    2. In Environment type (Tipo ambiente), seleziona Linux o Windows.

    3. Per Registro delle immagini, scegli Altro registro.

    4. In URL di registro esterno, inserisci la posizione dell'immagine e in Credenziali di registro (facoltativo) inserisci l'ARN o il nome delle tue credenziali di Secrets Manager.

      Nota

      Se le credenziali non esistono nella regione corrente, devi utilizzare l'ARN. Non puoi utilizzare il nome delle credenziali se esistono in un'altra regione.