This PR enhances the Docker build and deployment process for the Arcade Worker by: - **Modularizing Docker Builds:** - Introduces a new `INSTALL_TOOLKITS` build argument in the `Dockerfile` to conditionally include toolkits. this enables the creation of a `arcadeai/worker-base` which can be used to build custom containers in a multi-stage build. an example of this is included in the example dir. - Adds `docker-base` Makefile target to build a lightweight base image without toolkits. - **Publishing to GitHub Container Registry (GHCR):** - Adds Makefile targets `publish-ghcr` and `gh-login` for pushing images to GHCR. - Supports publishing both base and full images with toolkits to GHCR. - **Docker Compose:** - Add Docker compose file and setup - Renames the `actor` service to `worker` - Adds an `nginx` service in `docker-compose.yml` to proxy requests to the Arcade Engine. - Introduces an `nginx.conf` file for the Nginx service. - **Streamlining Toolkit Installation:** - Moves toolkit installation from the `start.sh` script to the Docker build process. - Creates a `toolkits.txt` file to manage toolkit dependencies which can be edited easily when we want to add a new toolkit. Developers can also use this approach as shown in the example. - **Improving Configuration Files:** - Updates `docker.engine.yaml` and `env.example` to align with the new setup. TODO: - CI/CD needs to be adjusted so that images are pushed to ghcr on release. - AWS resources need to be renamed actor -> worker @EricGustin This can go in after the above two items are resolved. --------- Co-authored-by: Wils Dawson <wils@arcade-ai.com> Co-authored-by: Eric Gustin <34000337+EricGustin@users.noreply.github.com> Co-authored-by: sdreyer <sterling@arcade-ai.com> Co-authored-by: Sterling Dreyer <sdreyer21@gmail.com> Co-authored-by: Nate Barbettini <nathanaelb@gmail.com>
142 lines
5.9 KiB
Makefile
142 lines
5.9 KiB
Makefile
VENDOR ?= ArcadeAI
|
|
PROJECT ?= ArcadeAI
|
|
SOURCE ?= https://github.com/ArcadeAI/arcade-ai
|
|
LICENSE ?= MIT
|
|
DESCRIPTION ?= "Arcade Worker for LLM Tool Serving"
|
|
REPOSITORY ?= arcadeai/worker
|
|
ECR_ENDPOINT ?= 471112909428.dkr.ecr.us-east-1.amazonaws.com
|
|
ARCH ?= $(shell uname -m)
|
|
|
|
VERSION ?= 0.1.0.dev0
|
|
COMMIT ?= $(shell git describe --dirty --always --abbrev=15)
|
|
BUILD_DATE ?= $(shell date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
IMAGE_NAME ?= worker
|
|
PORT ?= 8002
|
|
INSTALL_TOOLKITS ?= true
|
|
|
|
# If INSTALL_TOOLKITS is true, we are building the worker image with all toolkits
|
|
# Otherwise, we are building the worker image with no toolkits
|
|
ifeq ($(INSTALL_TOOLKITS), true)
|
|
REPOSITORY := $(REPOSITORY)
|
|
else
|
|
REPOSITORY := $(REPOSITORY)-base
|
|
endif
|
|
|
|
VERSION_TAG := $(VERSION)-$(ARCH)
|
|
|
|
.PHONY: docker-build
|
|
docker-build: ## Build the Docker container
|
|
@echo "🛠️ Building Docker image ($(VERSION_TAG)).."
|
|
@echo "- Commit: $(COMMIT)"
|
|
@echo "- Build Date: $(BUILD_DATE)"
|
|
@docker build --build-arg PORT=$(PORT) -f Dockerfile -t $(REPOSITORY):$(VERSION_TAG) \
|
|
--build-arg INSTALL_TOOLKITS=$(INSTALL_TOOLKITS) \
|
|
--build-arg PORT=$(PORT) \
|
|
--build-arg VERSION="$(VERSION)" \
|
|
--build-arg COMMIT="$(COMMIT)" \
|
|
--build-arg BUILD_DATE="$(BUILD_DATE)" \
|
|
--label=org.opencontainers.image.vendor="$(VENDOR)" \
|
|
--label=org.opencontainers.image.title="$(PROJECT)" \
|
|
--label=org.opencontainers.image.revision="$(COMMIT)" \
|
|
--label=org.opencontainers.image.version="$(VERSION_TAG)" \
|
|
--label=org.opencontainers.image.created="$(BUILD_DATE)" \
|
|
--label=org.opencontainers.image.source="$(SOURCE)" \
|
|
--label=org.opencontainers.image.licenses="$(LICENSE)" \
|
|
--label=org.opencontainers.image.description=$(DESCRIPTION) \
|
|
..
|
|
|
|
|
|
ecr-manifest: ## Make a manifest file for the image
|
|
@echo "🛠️ Build manifest file for $(REPOSITORY):$(VERSION).."
|
|
@echo "- Commit: $(COMMIT)"
|
|
@echo "- Build Date: $(BUILD_DATE)"
|
|
@export DOCKER_CLI_EXPERIMENTAL=enabled
|
|
@echo "- Creating manifest $(ECR_ENDPOINT)/$(REPOSITORY):$(VERSION)"
|
|
@docker manifest create $(ECR_ENDPOINT)/$(REPOSITORY):$(VERSION) \
|
|
--amend $(ECR_ENDPOINT)/$(REPOSITORY):$(VERSION)-arm64 \
|
|
--amend $(ECR_ENDPOINT)/$(REPOSITORY):$(VERSION)-amd64
|
|
@echo "- Creating manifest $(ECR_ENDPOINT)/$(REPOSITORY):latest"
|
|
@docker manifest create $(ECR_ENDPOINT)/$(REPOSITORY):latest \
|
|
--amend $(ECR_ENDPOINT)/$(REPOSITORY):$(VERSION)-arm64 \
|
|
--amend $(ECR_ENDPOINT)/$(REPOSITORY):$(VERSION)-amd64
|
|
@echo "- Inspecting manifest $(ECR_ENDPOINT)/$(REPOSITORY):$(VERSION)"
|
|
@docker manifest inspect $(ECR_ENDPOINT)/$(REPOSITORY):$(VERSION)
|
|
@echo "- Inspecting manifest $(ECR_ENDPOINT)/$(REPOSITORY):latest"
|
|
@docker manifest inspect $(ECR_ENDPOINT)/$(REPOSITORY):latest
|
|
@echo "- Pushing manifest $(ECR_ENDPOINT)/$(REPOSITORY):$(VERSION)"
|
|
@docker manifest push $(ECR_ENDPOINT)/$(REPOSITORY):$(VERSION)
|
|
@echo "- Pushing manifest $(ECR_ENDPOINT)/$(REPOSITORY):latest"
|
|
@docker manifest push $(ECR_ENDPOINT)/$(REPOSITORY):latest
|
|
|
|
ghcr-manifest: ## Make a manifest file for the image
|
|
@echo "🛠️ Build manifest file for $(REPOSITORY):$(VERSION).."
|
|
@echo "- Commit: $(COMMIT)"
|
|
@echo "- Build Date: $(BUILD_DATE)"
|
|
@export DOCKER_CLI_EXPERIMENTAL=enabled
|
|
@echo "- Creating manifest ghcr.io/$(REPOSITORY):$(VERSION)"
|
|
@docker manifest create ghcr.io/$(REPOSITORY):$(VERSION) \
|
|
--amend ghcr.io/$(REPOSITORY):$(VERSION)-arm64 \
|
|
--amend ghcr.io/$(REPOSITORY):$(VERSION)-amd64
|
|
@echo "- Creating manifest ghcr.io/$(REPOSITORY):latest"
|
|
@docker manifest create ghcr.io/$(REPOSITORY):latest \
|
|
--amend ghcr.io/$(REPOSITORY):$(VERSION)-arm64 \
|
|
--amend ghcr.io/$(REPOSITORY):$(VERSION)-amd64
|
|
@echo "- Inspecting manifest ghcr.io/$(REPOSITORY):$(VERSION)"
|
|
@docker manifest inspect ghcr.io/$(REPOSITORY):$(VERSION)
|
|
@echo "- Inspecting manifest ghcr.io/$(REPOSITORY):latest"
|
|
@docker manifest inspect ghcr.io/$(REPOSITORY):latest
|
|
@echo "- Pushing manifest ghcr.io/$(REPOSITORY):$(VERSION)"
|
|
@docker manifest push ghcr.io/$(REPOSITORY):$(VERSION)
|
|
@echo "- Pushing manifest ghcr.io/$(REPOSITORY):latest"
|
|
@docker manifest push ghcr.io/$(REPOSITORY):latest
|
|
|
|
.PHONY: docker-run
|
|
docker-run: ## Run the Docker container
|
|
@echo "\n🚀 Run the container with the following ..."
|
|
@echo ">>> docker run -d -p $(PORT):$(PORT) $(REPOSITORY):$(VERSION_TAG)"
|
|
|
|
.PHONY: publish-ecr
|
|
publish-ecr:
|
|
@echo "🚚 Pushing the Agent image to ECR.."
|
|
@docker tag $(REPOSITORY):$(VERSION_TAG) $(ECR_ENDPOINT)/$(REPOSITORY):$(VERSION_TAG)
|
|
@echo "- pushing $(ECR_ENDPOINT)/$(REPOSITORY):$(VERSION_TAG)"
|
|
@docker push $(ECR_ENDPOINT)/$(REPOSITORY):$(VERSION_TAG)
|
|
@echo $(VERSION_TAG) | grep -q $(RC_PART) || { \
|
|
docker tag $(REPOSITORY):$(VERSION_TAG) $(ECR_ENDPOINT)/$(REPOSITORY):latest-$(ARCH); \
|
|
echo "- pushing $(ECR_ENDPOINT)/$(REPOSITORY):latest-$(ARCH)"; \
|
|
docker push $(ECR_ENDPOINT)/$(REPOSITORY):latest-$(ARCH); \
|
|
}
|
|
|
|
.PHONY: publish-ghcr
|
|
publish-ghcr:
|
|
@echo "🚚 Pushing the Agent image to GHCR.."
|
|
@docker tag $(REPOSITORY):$(VERSION_TAG) ghcr.io/$(REPOSITORY):$(VERSION_TAG)
|
|
@echo "- pushing ghcr.io/$(REPOSITORY):$(VERSION_TAG)"
|
|
@docker push ghcr.io/$(REPOSITORY):$(VERSION_TAG)
|
|
@echo $(VERSION) | grep -q $(RC_PART) || { \
|
|
docker tag $(REPOSITORY):$(VERSION_TAG) ghcr.io/$(REPOSITORY):latest-$(ARCH); \
|
|
echo "- pushing ghcr.io/$(REPOSITORY):latest-$(ARCH)"; \
|
|
docker push ghcr.io/$(REPOSITORY):latest-$(ARCH); \
|
|
}
|
|
|
|
|
|
.PHONY: ecr-login
|
|
ecr-login: ## Login to ECR
|
|
@aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $(ECR_ENDPOINT)
|
|
|
|
|
|
.PHONY: gh-login
|
|
gh-login: ## Login to GHCR
|
|
@echo "🚚 Logging in to GHCR..."
|
|
@if [ -z "$(GHCR_PAT)" ]; then \
|
|
echo "Error: GHCR_PAT environment variable is not set"; \
|
|
exit 1; \
|
|
fi
|
|
@echo $(GHCR_PAT) | docker login ghcr.io -u arcadeai --password-stdin
|
|
|
|
.PHONY: help
|
|
help:
|
|
@echo "🛠️ Worker Docker Commands:\n"
|
|
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
|
|
|
|
.DEFAULT_GOAL := help
|