Веду мою последнюю тему реализации как можно большего количества автоматизации в AWS. Сегодня я собираюсь поделиться тем, как мы можем создать изображения Docker в нашем конвейере CI/CD в AWS. В частности, мы собираемся исследовать:
- Расширение нашего шаблона Terraform, который предоставляет наш трубопровод CI/CD для предоставления реестра эластичных контейнеров AWS (ECR).
- Создание простого Dockerfile для API Barebones ExpressJS.
- Использование Docker
сборка
,тег
иpush
Внутри нашегоbuildspec.yml
Файл для публикации нашего последнего изображения в ECR. - Вытаскивая новейшее изображение из нашего реестра и запустить его на местном уровне.
Теперь, когда у нас есть земля, давайте поговорим о том, как мы можем расширить Наш обычный шаблон Terraform CI/CD Для поддержки здания Docker Images.
Включение ECR в наш трубопровод CI/CD
Чтобы начать, нам сначала нужно создать наш шаблон Terraform, который обеспечивает наш шаблон CI/CD. Мы можем сделать это с помощью Terraform-aws-codecommit-cicd
модуль, который мы видели в предыдущем посте.
Полный шаблон можно найти здесь .
variable "image_name" { type = "string" } module "codecommit-cicd" { source = "git::https://github.com/slalompdx/terraform-aws-codecommit-cicd.git?ref=master" repo_name = "docker-image-build" # Required organization_name = "kylegalbraith" # Required repo_default_branch = "master" # Default value aws_region = "us-west-2" # Default value char_delimiter = "-" # Default value environment = "dev" # Default value build_timeout = "5" # Default value build_compute_type = "BUILD_GENERAL1_SMALL" # Default value build_image = "aws/codebuild/docker:17.09.0" # Default value build_privileged_override = "true" # Default value test_buildspec = "buildspec_test.yml" # Default value package_buildspec = "buildspec.yml" # Default value force_artifact_destroy = "true" # Default value }
Вверху мы видим, что мы объявили переменную, image_name
, это будет передано в шаблон. Далее мы видим, что мы создаем наш CodeCommit-CICD
модуль. Это немного отличается от того, что мы видели в прошлом.
- Во -первых,
build_image
свойство установлено наAWS/Codebuild/Docker: 17.09.0
Анкет Это изображение AWS, предоставленное Codebuild, которое позволяет нам создавать собственные изображения Docker. - Во -вторых,
build_privileged_override
Собственность новая. Это свойство сообщает Codebuild, что мы будем создавать изображения Docker, поэтому предоставьте нам доступ к ней.
Это единственные две вещи, которые нам нужно изменить в нашем трубопроводе CI/CD, чтобы поддержать создание изображений Docker в кодовой строительстве AWS. Давайте посмотрим на следующие два ресурса, определенные ниже.
resource "aws_ecr_repository" "image_repository" { name = "${var.image_name}" } resource "aws_iam_role_policy" "codebuild_policy" { name = "serverless-codebuild-automation-policy" role = "${module.codecommit-cicd.codebuild_role_name}" policy = <
Мы начнем с определения нашего реестра эластичных контейнеров AWS (ECR). Это полностью управляемый реестр контейнеров Docker внутри нашей учетной записи AWS. Мы можем хранить, управлять и развернуть наши контейнерные изображения с помощью ECR. Заметьте здесь, мы используем image_name
переменная, которая была передана в наш шаблон для названия нашего репозитория ECR.
Последняя часть, которую мы видим здесь, — это дополнительная политика IAM, которая прилагается к той роли, которую предполагает наш проект CodeBuild. Эта политика предоставляет разрешение нашему проекту CodeBuild на то, чтобы выдвигать изображения в нашем репозитории изображения.
Теперь, когда мы, какие ресурсы будут созданы, давайте продолжим и фактически создадим их с помощью Terraform.
Чтобы начать, мы инициализируем наших поставщиков и наш шаблон с init
командование
deployment-pipeline$ terraform init Initializing modules... - module.codecommit-cicd - module.codecommit-cicd.unique_label Initializing provider plugins...
Как только наш шаблон инициализирован, мы можем быстро запустить план
Команда подтвердит все ресурсы, которые будут созданы.
deployment-pipeline$ terraform plan -var image_name=sample-express-app An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: + aws_ecr_repository.image_repository .... ...... ........ Plan: 13 to add, 0 to change, 0 to destroy. -----------------------------------------------------------------------------
Мы, что 13 ресурсов будут созданы. Давайте продолжим и запустим наш применить
Команда создать все это в нашей учетной записи AWS.
deployment-pipeline$ terraform apply -auto-approve -var image_name=sample-express-app data.aws_iam_policy_document.codepipeline_assume_policy: Refreshing state... module.codecommit-cicd.module.unique_label.null_resource.default: Creating... .... ...... ........ module.codecommit-cicd.aws_iam_role_policy.codebuild_policy: Creation complete after 1s (ID: docker-image-build-codebuild-role:docker-image-build-codebuild-policy) module.codecommit-cicd.aws_codepipeline.codepipeline: Creation complete after 1s (ID: docker-image-build) Apply complete! Resources: 13 added, 0 changed, 0 destroyed. Outputs: codebuild_role = arn:aws:iam:::role/docker-image-build-codebuild-role codepipeline_role = arn:aws:iam:: :role/docker-image-build-codepipeline-role ecr_image_respository_url = .dkr.ecr.us-west-2.amazonaws.com/sample-express-app repo_url = https://git-codecommit.us-west-2.amazonaws.com/v1/repos/docker-image-build
Мы видим, что 13 ресурсов были созданы и что наш URL -адрес GIT Repo, а также наш URL -адрес ECR, был выведен. Скопируйте URL -адрес ECR где -то, чтобы он и в настоящее время понадобится, как только нам нужно настроить buildspec.yml
File Codebuild будет использовать.
Давайте сделаем краткий обзор изображения Docker, которое мы собираемся построить и подтолкнуть к нашему новому репозиторию ECR.
Наше образец приложения и изображения Docker
Для нашей демонстрации я создал GitHub Repository Это имеет пример Express API, настроенный. В нем мы видим наш api.js
Файл, который содержит нашу логику приложения.
const express = require('express'); // Constants const PORT = 8080; const HOST = '0.0.0.0'; const app = express(); app.get('/health', (req, res) => { res.send('The API is healthy, thanks for checking!\n'); }); app.listen(PORT, HOST); console.log(`Running API on port ${PORT}`);
Это не делает ничего волшебного, но идеально подходит для демонстрации нашей конструкции изображения Docker. Мы настраиваем Экспресс
Слушать на порту 8080
и настройка маршрута, /здоровье
, чтобы вернуть простой ответ.
Чтобы пойти с нашим образцом приложения, у нас также есть образец Dockerfile
Анкет
FROM node:8 WORKDIR /src/app # Install app dependencies COPY package*.json ./ RUN npm install # Copy app contents COPY . . # App runs on port 8080 EXPOSE 8080 # Start the app CMD [ "npm", "start"]
Быстрое изложение того, что здесь делает наш Dockerfile.
От
Указывает базовое изображение Наше изображение будет построено. В нашем случае мы используем изображение узла 8, которое происходит от Docker Hub АнкетWorkdir
устанавливает наш рабочий каталог для любых команд, которые появляются после.Копия
просто делает копию нашегоPackage.json
файлы в наш рабочий каталог.Запустить
используется для запуска команд, здесь мы работаемNPM Установка
АнкетРазоблачить
говорит Docker, что наш контейнер планирует выслушать в порту 8080.CMD
Указывает поведение по умолчанию для нашего контейнера. В нашем случае мы называем сценарий,старт
, внутри нашихPackage.json
Это тогда начинает наш экспресс -сервер вapi.js
Анкет
Смотри не плохо, верно? Есть много вещей, которые вы можете настроить внутри Dockerfile. Это фантастика для того, чтобы получить правильные изображения и позволяет вашим контейнерам запускать и делать то, что им нужно сделать, никакой дальнейшей конфигурации не требуется.
Построение наше изображение Docker внутри нашего конвейера CI/CD
У нас есть базовые ресурсы AWS для нашего обеспечения конвейера CI/CD. У нас есть образец приложения, в котором с ним связан Dockerfile. Теперь все, что осталось, — это создание нашего изображения Docker внутри нашего конвейера развертывания в AWS.
Последнее, что нам нужно сделать, чтобы начать создавать наше изображение Docker внутри AWS Codepipeline и Codebuild, — это настроить нашу buildspec.yml
файл.
Снова, глядя на наш Пример репозитория Мы видим, что наш buildspec.yml
Файл лежит в основе нашего репо. Взглянув на это, мы видим следующие команды.
version: 0.2 phases: install: commands: - echo install step... pre_build: commands: - echo logging in to AWS ECR... - $(aws ecr get-login --no-include-email --region us-west-2) build: commands: - echo build Docker image on `date` - cd src - docker build -t sample-express-app:latest . - docker tag sample-express-app:latest/sample-express-app:latest post_build: commands: - echo build Docker image complete `date` - echo push latest Docker images to ECR... - docker push /sample-express-app:latest
В pre_build
Шаг мы выпускаем Get-login
Позвоните в ECR через AWS CLI Анкет Результатом этого вызова является немедленно выполняется, но для ссылки здесь является то, что этот вызов возвращается.
docker login -u AWS -phttps:// .dkr.ecr.us-west-2.amazonaws.com
Вызов возвращает Docker Вход
Команда, чтобы получить доступ к нашему репозиторию ECR.
Далее, в сборка
Команда мы работаем Docker Build
из нашего SRC
каталог, потому что именно здесь наш Dockerfile
расположен. Команда сборки собирается создать изображение из этого файла и пометить его с помощью Образец-Express-App: последний
Анкет
Затем мы принимаем это изображение с тегом исходного источника и добавляем целевое изображение с меткой, которое использует наш URL -адрес репозитория ECR.
Со всем этим сделано, мы запускаем Docker push
командование, чтобы выдвинуть наше целевое изображение в репозиторий ECR.
Круто, верно? Теперь с каждым приверженностью овладеть в нашем репозитории наш трубопровод CI/CD запускается. Наш процесс сборки может затем взять наш код и dockerfile, чтобы создать новое изображение контейнера, которое напрямую подтолкнуто к нашему частному репозиторию изображения в ECR.
Тестирование нашей сантехники
Мы получили нашу инфраструктуру в AWS. Когда новый коммит вступает в Master, из нашего Dockerfile создается новый контейнер. Мы подталкиваем это новое изображение непосредственно к нашему частному репозиторию изображения в ECR.
Тестирование просты. Мы можем просто вытащить последнее изображение из нашего репозитория ECR.
kyleg$ $(aws ecr get-login --no-include-email --region us-west-2) Login succeeded kyleg$ docker pull/sample-express-app:latest latest: Pulling from sample-express-app kyleg$ docker run -p 8080:8080 -i /sample-express-app:latest > docker_app_express@1.0.0 start /src/app > node api.js Running API on port 8080
Теперь может открыться Localhost: 8080/Health
В нашем браузере или запустите запрос скручивания в нашей командной строке.
kyleg$ curl localhost:8080/health The API is healthy, thanks for checking!
При этом мы успешно использовали наше изображение ECR для создания контейнера, который мы можем запустить локально.
Вывод
В этом посте мы погрузились в то, как мы можем создать конвейер CI/CD в AWS, чтобы постоянно создавать изображения Docker для нашего образца приложения. Мы также продемонстрировали, что мы можем опубликовать эти изображения в наш собственный репозиторий изображения с помощью реестра эластичных контейнеров.
Имея всего несколько небольших изменений в нашем модуле Terraform, мы смогли встать этот трубопровод всего за несколько минут. С основами Docker в нашем поясе мы можем начать строить более сложные изображения.
Мы могли бы исследовать, как подтолкнуть эти изображения в общественный репозиторий, как Dockerhub. Или, может быть, как развернуть контейнеры, используя эти изображения с помощью EKS или ECS. Возможности почти бесконечны.
Если у вас есть какие -либо вопросы, касающиеся этого поста, просто бросьте комментарий ниже, и я буду рад помочь.
Вы голодны, чтобы узнать больше о веб -сервисах Amazon?
Хотите узнать больше о AWS? Недавно я выпустил электронную книгу и видео, который прорезает море информации. Он фокусируется на хостинге, защите и развертывании статических веб -сайтов на AWS. Цель состоит в том, чтобы изучить услуги, связанные с этой проблемой, поскольку вы их используете. Если вы хотели выучить AWS, но вы не уверены, с чего начать, проверьте мой курс .
Оригинал: «https://dev.to/kylegalbraith/how-to-build-your-docker-images-in-aws-with-ease-3174»