Skip to content

Commit cb4b9e8

Browse files
authored
feat: add remote repository to handle DockerHub rate limits (#1266)
1 parent d36903c commit cb4b9e8

22 files changed

Lines changed: 579 additions & 59 deletions

File tree

iac/provider-gcp/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ tf_vars := TF_VAR_environment=$(TERRAFORM_ENVIRONMENT) \
6262
$(call tfvar, FILESTORE_MAX_DISK_USAGE_TARGET) \
6363
$(call tfvar, BUILD_CLUSTER_CACHE_DISK_TYPE) \
6464
$(call tfvar, CLIENT_CLUSTER_CACHE_DISK_TYPE) \
65-
$(call tfvar, MIN_CPU_PLATFORM)
65+
$(call tfvar, MIN_CPU_PLATFORM) \
66+
$(call tfvar, REMOTE_REPOSITORY_ENABLED)
6667

6768
.PHONY: init
6869
init:

iac/provider-gcp/main.tf

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -232,11 +232,12 @@ module "nomad" {
232232
envd_timeout = var.envd_timeout
233233

234234
# Template manager
235-
builder_node_pool = var.build_node_pool
236-
template_manager_port = var.template_manager_port
237-
template_bucket_name = module.init.fc_template_bucket_name
238-
build_cache_bucket_name = module.init.fc_build_cache_bucket_name
239-
template_manager_machine_count = var.build_cluster_size
235+
builder_node_pool = var.build_node_pool
236+
template_manager_port = var.template_manager_port
237+
template_bucket_name = module.init.fc_template_bucket_name
238+
build_cache_bucket_name = module.init.fc_build_cache_bucket_name
239+
template_manager_machine_count = var.build_cluster_size
240+
dockerhub_remote_repository_url = var.remote_repository_enabled ? module.remote_repository[0].dockerhub_remote_repository_url : ""
240241

241242
# Redis
242243
redis_managed = var.redis_managed
@@ -259,3 +260,16 @@ module "redis" {
259260

260261
prefix = var.prefix
261262
}
263+
264+
module "remote_repository" {
265+
source = "./remote-repository"
266+
267+
count = var.remote_repository_enabled ? 1 : 0
268+
269+
prefix = var.prefix
270+
271+
gcp_project_id = var.gcp_project_id
272+
gcp_region = var.gcp_region
273+
274+
google_service_account_email = module.init.service_account_email
275+
}

iac/provider-gcp/nomad/jobs/template-manager.hcl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ job "template-manager-system" {
7676
ALLOW_SANDBOX_INTERNET = "${allow_sandbox_internet}"
7777
SHARED_CHUNK_CACHE_PATH = "${shared_chunk_cache_path}"
7878
CLICKHOUSE_CONNECTION_STRING = "${clickhouse_connection_string}"
79+
DOCKERHUB_REMOTE_REPOSITORY_URL = "${dockerhub_remote_repository_url}"
7980
%{ if !update_stanza }
8081
FORCE_STOP = "true"
8182
%{ endif }

iac/provider-gcp/nomad/main.tf

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -494,19 +494,20 @@ resource "nomad_job" "template_manager" {
494494
environment = var.environment
495495
consul_acl_token = var.consul_acl_token_secret
496496

497-
api_secret = var.api_secret
498-
bucket_name = var.fc_env_pipeline_bucket_name
499-
docker_registry = var.custom_envs_repository_name
500-
google_service_account_key = var.google_service_account_key
501-
template_manager_checksum = data.external.template_manager.result.hex
502-
otel_tracing_print = var.otel_tracing_print
503-
template_bucket_name = var.template_bucket_name
504-
build_cache_bucket_name = var.build_cache_bucket_name
505-
otel_collector_grpc_endpoint = "localhost:${var.otel_collector_grpc_port}"
506-
logs_collector_address = "http://localhost:${var.logs_proxy_port.port}"
507-
orchestrator_services = "template-manager"
508-
allow_sandbox_internet = var.allow_sandbox_internet
509-
clickhouse_connection_string = local.clickhouse_connection_string
497+
api_secret = var.api_secret
498+
bucket_name = var.fc_env_pipeline_bucket_name
499+
docker_registry = var.custom_envs_repository_name
500+
google_service_account_key = var.google_service_account_key
501+
template_manager_checksum = data.external.template_manager.result.hex
502+
otel_tracing_print = var.otel_tracing_print
503+
template_bucket_name = var.template_bucket_name
504+
build_cache_bucket_name = var.build_cache_bucket_name
505+
otel_collector_grpc_endpoint = "localhost:${var.otel_collector_grpc_port}"
506+
logs_collector_address = "http://localhost:${var.logs_proxy_port.port}"
507+
orchestrator_services = "template-manager"
508+
allow_sandbox_internet = var.allow_sandbox_internet
509+
clickhouse_connection_string = local.clickhouse_connection_string
510+
dockerhub_remote_repository_url = var.dockerhub_remote_repository_url
510511

511512
# For now we DISABLE the shared chunk cache in the template manager
512513
shared_chunk_cache_path = ""

iac/provider-gcp/nomad/variables.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,3 +340,7 @@ variable "filestore_cache_max_disk_usage_target" {
340340
type = number
341341
description = "The maximum disk usage target for the Filestore cache in percent"
342342
}
343+
344+
variable "dockerhub_remote_repository_url" {
345+
type = string
346+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
resource "google_artifact_registry_repository" "dockerhub_remote_repository" {
2+
location = var.gcp_region
3+
repository_id = "${var.prefix}docker-remote-repository"
4+
description = "remote docker repository"
5+
format = "DOCKER"
6+
mode = "REMOTE_REPOSITORY"
7+
remote_repository_config {
8+
description = "Docker Hub"
9+
docker_repository {
10+
public_repository = "DOCKER_HUB"
11+
}
12+
}
13+
14+
cleanup_policies {
15+
id = "delete-older-than-90-days"
16+
action = "DELETE"
17+
condition {
18+
older_than = "90d"
19+
}
20+
}
21+
}
22+
23+
resource "google_artifact_registry_repository_iam_member" "dockerhub_remote_repository_member" {
24+
repository = google_artifact_registry_repository.dockerhub_remote_repository.name
25+
role = "roles/artifactregistry.repoAdmin"
26+
member = "serviceAccount:${var.google_service_account_email}"
27+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
output "dockerhub_remote_repository_url" {
2+
value = "${var.gcp_region}-docker.pkg.dev/${var.gcp_project_id}/${google_artifact_registry_repository.dockerhub_remote_repository.name}"
3+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
variable "prefix" {
2+
type = string
3+
}
4+
5+
variable "gcp_project_id" {
6+
type = string
7+
}
8+
9+
variable "gcp_region" {
10+
type = string
11+
}
12+
13+
variable "google_service_account_email" {
14+
type = string
15+
}

iac/provider-gcp/variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,3 +452,9 @@ variable "orchestrator_base_hugepages_percentage" {
452452
type = number
453453
default = 80
454454
}
455+
456+
variable "remote_repository_enabled" {
457+
type = bool
458+
description = "Set to true to enable remote repository cache. Can be set via TF_VAR_remote_repository_enabled or REMOTE_REPOSITORY_ENABLED env var."
459+
default = false
460+
}

packages/orchestrator/cmd/build-template/main.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/e2b-dev/infra/packages/orchestrator/internal/template/build/config"
2424
"github.com/e2b-dev/infra/packages/orchestrator/internal/template/build/metrics"
2525
artifactsregistry "github.com/e2b-dev/infra/packages/shared/pkg/artifacts-registry"
26+
"github.com/e2b-dev/infra/packages/shared/pkg/dockerhub"
2627
featureflags "github.com/e2b-dev/infra/packages/shared/pkg/feature-flags"
2728
l "github.com/e2b-dev/infra/packages/shared/pkg/logger"
2829
sbxlogger "github.com/e2b-dev/infra/packages/shared/pkg/logger/sandbox"
@@ -136,6 +137,17 @@ func buildTemplate(
136137
return fmt.Errorf("error getting artifacts registry provider: %w", err)
137138
}
138139

140+
dockerhubRepository, err := dockerhub.GetRemoteRepository(ctx)
141+
if err != nil {
142+
return fmt.Errorf("error getting dockerhub repository: %w", err)
143+
}
144+
defer func() {
145+
err := dockerhubRepository.Close()
146+
if err != nil {
147+
logger.Error("error closing dockerhub repository", zap.Error(err))
148+
}
149+
}()
150+
139151
blockMetrics, err := blockmetrics.NewMetrics(noop.NewMeterProvider())
140152
if err != nil {
141153
return fmt.Errorf("error creating metrics: %w", err)
@@ -164,6 +176,7 @@ func buildTemplate(
164176
persistenceTemplate,
165177
persistenceBuild,
166178
artifactRegistry,
179+
dockerhubRepository,
167180
sandboxProxy,
168181
sandboxes,
169182
templateCache,

0 commit comments

Comments
 (0)