diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..827e02326 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +.* +!.git +__pycache__/ +*.py[cod] +input +models +notebooks +output diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 000000000..541a7aac9 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,101 @@ +name: Build and publish Docker images + +on: + push: + branches: + - master + pull_request: + branches: + - master + release: + types: [published] + +jobs: + docker: + strategy: + fail-fast: false + matrix: + include: + - id: cu118 + name: CUDA 11.8 + pytorch_install_args: "--index-url https://download.pytorch.org/whl/cu118" + - id: cu121 + name: CUDA 12.1 + pytorch_install_args: "--index-url https://download.pytorch.org/whl/cu121" + - id: cu124 + name: CUDA 12.4 + pytorch_install_args: "--index-url https://download.pytorch.org/whl/cu124" + - id: rocm6.2 + name: ROCm 6.2 + pytorch_install_args: "--index-url https://download.pytorch.org/whl/rocm6.2" + - id: cpu + name: CPU only + pytorch_install_args: "--index-url https://download.pytorch.org/whl/cpu" + extra_args: --cpu + + + name: ${{ matrix.name }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Check which repositories to use + id: repositories + run: | + echo "GHCR_IMAGE_NAME=ghcr.io/${GITHUB_REPOSITORY_OWNER}/comfyui" >> "$GITHUB_ENV" + if [[ -n "${DOCKERHUB_USERNAME}" ]]; then + echo "DOCKERHUB_IMAGE_NAME=${DOCKERHUB_USERNAME}/comfyui" >> "$GITHUB_ENV" + else + echo "DOCKERHUB_IMAGE_NAME=" >> "$GITHUB_ENV" + echo "No Docker Hub username set, only deploying to GitHub Container Repository" + fi + env: + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }} + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + # list of Docker images to use as base name for tags + images: | + ${{ env.DOCKERHUB_IMAGE_NAME }} + ${{ env.GHCR_IMAGE_NAME }} + flavor: | + suffix=-${{ matrix.id }},onlatest=true + # generate Docker tags based on the following events/attributes + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + type=sha + # set latest tag for default branch + type=raw,value=latest,enable=${{ github.event_name == 'release' }} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub + if: github.event_name != 'pull_request' && env.DOCKERHUB_IMAGE_NAME != '' + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to GHCR + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + build-args: | + PYTORCH_INSTALL_ARGS=${{ matrix.pytorch_install_args }} + EXTRA_ARGS=${{ matrix.extra_args }} + cache-from: type=gha,scope=${{ github.ref_name }}-${{ matrix.id }} + cache-to: type=gha,mode=max,scope=${{ github.ref_name }}-${{ matrix.id }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..ee361f276 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,79 @@ +# syntax=docker/dockerfile:1 + +ARG PYTHON_VERSION=3.12 + +FROM python:${PYTHON_VERSION}-slim + +ARG PYTORCH_INSTALL_ARGS="" +ARG EXTRA_ARGS="" +ARG USERNAME=comfyui +ARG USER_UID=1000 +ARG USER_GID=${USER_UID} + +# Fail fast on errors or unset variables +SHELL ["/bin/bash", "-eux", "-o", "pipefail", "-c"] + +RUN < [!NOTE] +> For building the CPU-only image, it is recommended that you add the --cpu flag to the EXTRA_ARGS build arg: +> +> ```shell +> docker build --build-arg PYTORCH_INSTALL_ARGS="--index-url https://download.pytorch.org/whl/cpu" --build-arg EXTRA_ARGS=--cpu . +> ``` + ### Others: #### Apple Mac silicon diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 000000000..858840fbe --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,21 @@ +services: + comfyui: + user: "1000:1000" + build: . + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: [gpu] + ports: + - "8188:8188" + volumes: + - "./models:/app/models" + - "./input:/app/input" + - "./temp:/app/output/temp" + - "./output:/app/output" + - "./user:/app/user" + - "./custom_venv:/app/custom_venv" + - "./custom_nodes:/app/custom_nodes"