Я сделал это все, кроме развертывания через CircleCI. когда я запускаю terraform apply, я могу использовать образ в ECR, тогда мой terraform создает кластер, определение задачи и службу. Все идет хорошо; однако, когда CircleCI пытается запустить команды докера, это не удается.
Я просто сдаюсь после целого дня, проведенного здесь.
Это часть кода, который я считаю компромиссным:
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "2.24.0"
}
}
}
provider "docker" {
registry_auth {
address = data.aws_ecr_authorization_token.token.proxy_endpoint
username = data.aws_ecr_authorization_token.token.user_name
password = data.aws_ecr_authorization_token.token.password
}
}
resource "aws_ecr_repository" "this" {
name = "${var.service_name}-vpn"
image_tag_mutability = "MUTABLE"
image_scanning_configuration {
scan_on_push = true
}
encryption_configuration {
encryption_type = "AES256"
}
}
resource "docker_registry_image" "this" {
name = "${aws_ecr_repository.this.repository_url}:latest"
build {
context = "./${var.service_name}-vpn"
dockerfile = "Dockerfile"
}
}```
**This is the output from CircleCI which doesn't happen on my computer; I have tried though, using the dind image. I still get the same error.**
> Initializing the backend...
Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.
Initializing provider plugins...
- Reusing previous version of kreuzwerker/docker from the dependency lock file
- Reusing previous version of hashicorp/aws from the dependency lock file
- Installing kreuzwerker/docker v2.24.0...
- Installed kreuzwerker/docker v2.24.0 (self-signed, key ID BD080C4571C6104C)
- Installing hashicorp/aws v4.18.0...
- Installed hashicorp/aws v4.18.0 (signed by HashiCorp)
Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/cli/plugins/signing.html
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
/root/connections-terraform
connections-terraform
data.aws_ecr_authorization_token.token: Reading...
data.aws_secretsmanager_secret.this: Reading...
data.aws_iam_role.vpn_task: Reading...
data.aws_iam_role.ecs_task_execution_role: Reading...
data.aws_ecs_cluster.this: Reading...
data.aws_iam_role.vpn_task: Read complete after 0s [id=vpnTask]
data.aws_iam_role.ecs_task_execution_role: Read complete after 0s [id=ecsTaskExecutionRole]
data.aws_ecr_authorization_token.token: Read complete after 0s [id=*********]
data.aws_ecs_cluster.this: Read complete after 0s [id=arn:aws:ecs:*********:************:cluster/***-***]
2023-01-10T04:50:39.213Z [*****] provider.terraform-provider-docker_v2.24.0: Response contains error diagnostic: tf_provider_addr=provider tf_rpc=Configure @module=sdk.proto diagnostic_detail= diagnostic_severity=***** tf_proto_version=5.3 @caller=github.com/hashicorp/[email protected]/tfprotov5/internal/diag/diagnostics.go:55 diagnostic_summary = "Error pinging Docker server: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?" tf_req_id=******bc-d33d-*****-347d-****a137c68d timestamp=2023-01-10T04:50:39.213Z
2023-01-10T04:50:39.213Z [*****] vertex "provider[\"registry.terraform.io/kreuzwerker/docker\"]" error: Error pinging Docker server: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
data.aws_secretsmanager_secret.this: Read complete after 0s [id=arn:aws:secretsmanager:*********:************:secret:sandbox/vpn-832Y9J]
╷
│ Error: Error pinging Docker server: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
│
│ with provider["registry.terraform.io/kreuzwerker/docker"],
│ on main.tf line 16, in provider "docker":
│ 16: provider "docker" {
│
╵
Releasing state lock. This may take a few moments...
ERRO[0005] 1 error occurred:
* exit status 1
**This is part of my .circleci/confi.yml file **
version: 2.1
defaults: &defaults
docker:
- image: docker:20.10.22-dind
aws_auth:
@MarkoE В общем, я удалил docker как провайдера, а файл docker_registry_image. Вместо этого в config.yml: docker_version: &docker_version | orbs: aws-ecr: circleci/[email protected] aws-ecs: circleci/[email protected] | setup_remote_docker: | aws-ecr/build-and-push-image | aws-ecs/deploy-service-update
Хорошо, так ты говоришь мне, что это сработало? :)
@MarkoE Я мог бы перейти к следующему этапу в Circleci, но сейчас у меня проблемы с тем, что есть в моем Dockerfile COPY entrypoint.sh /entrypoint.sh
; однако я получаю это сообщение об ошибке> /entrypoint.sh not found: not found
. Я обнаружил, что мне нужно каким-то образом скопировать файлы в файл remote_docker. Любые подсказки?
Есть ли в вашем коде сценарий точки входа? Если нет, вы можете удалить его из Dockerfile. Если да, вам нужно создать его в своем репозитории.
@MarkoE да, у меня есть. создание образа с копированием файлов работает нормально, когда я создаю образ и отправляю его в ECR с моего хоста. Проблема заключается в создании образа из CircleCI; вот где COPY выдал ошибку. Как я могу создать скрипт в моем репо?
@MarkoE Я только что опубликовал окончательный код. Спасибо за руководство!
Несмотря на то, что код моего вопроса работает нормально, он не работал через CircleCI. Итак, способ, которым я решил это, был следующим:
Я удалил из main.tf провайдера докеров и docker_registry_image, а aws_ecr_repository оставил.
resource "aws_ecr_repository" "this" {
name = "${var.service_name}-vpn"
image_tag_mutability = "MUTABLE"
image_scanning_configuration {
scan_on_push = true
}
encryption_configuration {
encryption_type = "AES256"
}
}
В файл .circleci/config.yml я добавил следующие инструкции:
docker_version: &docker_version
version: 20.10.6
orbs:
aws-ecr: circleci/[email protected]
aws-ecs: circleci/[email protected]
jobs:
build-and-deploy-image:
steps:
- checkout
- setup_remote_docker:
<<: *docker_version
docker_layer_caching: true
- aws-ecr/build-and-push-image:
aws-access-key-id: AWS_ACCESS_KEY_ID
aws-secret-access-key: AWS_SECRET_ACCESS_KEY
aws-cli-version: latest
extra-build-args: "--compress"
region: AWS_REGION
build-path: ./services/vpn/vpn-image/
dockerfile: Dockerfile
path: ./services/vpn/vpn-image/
repo: vpn
tag: "latest,${CIRCLE_SHA1}"
registry-id: AWS_ECR_REGISTRY_ID
workflows:
build_ecr_ecs_task:
jobs:
- build-and-deploy-image:
requires:
- apply-terraform-sandbox
- aws-ecs/deploy-service-update:
aws-access-key-id: AWS_ACCESS_KEY_ID
aws-secret-access-key: AWS_SECRET_ACCESS_KEY
cluster: cluster-name
container-image-name-updates: container=container-name,tag=latest
family: service-name-vpn
requires:
- build-and-deploy-image
Вам не нужно использовать провайдера kreuzwerker, вы можете просто использовать команды docker: Circleci.com/docs/building-docker-images . Кроме того, существуют сферы CircleCI: Circleci.com/developer/orbs/orb/circleci/aws-ecr.