Skip to content

Commit

Permalink
Merge pull request #7 from mmartial/multibuild
Browse files Browse the repository at this point in the history
20250116: Multibuild
  • Loading branch information
mmartial authored Jan 17, 2025
2 parents 7f574ca + 16550e3 commit 4d70f24
Showing 11 changed files with 565 additions and 77 deletions.
9 changes: 7 additions & 2 deletions Dockerfile → Dockerfile/Dockerfile-ubuntu22_cuda12.3.2
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
ARG DOCKER_FROM=nvidia/cuda:12.3.2-runtime-ubuntu22.04
FROM ${DOCKER_FROM}
FROM nvidia/cuda:12.3.2-runtime-ubuntu22.04

# Here, we are using CUDNN8 (devel) -- CUDNN9 is also compatible for CUDA 12.3
# Adapted from https://gitlab.com/nvidia/container-images/cuda/-/blob/master/dist/12.2.2/ubuntu2204/devel/cudnn8/Dockerfile
ENV NV_CUDNN_VERSION=8.9.7.29
ENV NV_CUDNN_PACKAGE_NAME="libcudnn8"
@@ -15,6 +15,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
&& apt-mark hold ${NV_CUDNN_PACKAGE_NAME} \
&& rm -rf /var/lib/apt/lists/*

ARG BASE_DOCKER_FROM=nvidia/cuda:12.3.2-runtime-ubuntu22.04

##### Base

# Install system packages
@@ -49,8 +51,11 @@ RUN apt-get update -y --fix-missing \
python3-venv \
git \
sudo \
# Adding libGL (used by a few common nodes)
libgl1 \
libglib2.0-0 \
# Adding FFMPEG (for video generation workflow)
ffmpeg \
&& apt-get clean

ENV BUILD_FILE="/etc/image_base.txt"
89 changes: 89 additions & 0 deletions Dockerfile/Dockerfile-ubuntu22_cuda12.4.1
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
FROM nvidia/cuda:12.4.1-runtime-ubuntu22.04

# CUDNN9 "runtime" package
# Adapted from https://gitlab.com/nvidia/container-images/cuda/-/blob/master/dist/12.4.1/ubuntu2204/runtime/cudnn/Dockerfile
ENV NV_CUDNN_VERSION=9.1.0.70-1
ENV NV_CUDNN_PACKAGE_NAME=libcudnn9-cuda-12
ENV NV_CUDNN_PACKAGE="libcudnn9-cuda-12=${NV_CUDNN_VERSION}"

LABEL com.nvidia.cudnn.version="${NV_CUDNN_VERSION}"

RUN apt-get update && apt-get install -y --no-install-recommends \
${NV_CUDNN_PACKAGE} \
&& apt-mark hold ${NV_CUDNN_PACKAGE_NAME} \
&& rm -rf /var/lib/apt/lists/*

ARG BASE_DOCKER_FROM=nvidia/cuda:12.4.1-runtime-ubuntu22.04

##### Base

# Install system packages
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update -y --fix-missing\
&& apt-get install -y \
apt-utils \
locales \
ca-certificates \
&& apt-get upgrade -y \
&& apt-get clean

# UTF-8
RUN localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
ENV LANG=en_US.utf8
ENV LC_ALL=C

# Install needed packages
RUN apt-get update -y --fix-missing \
&& apt-get upgrade -y \
&& apt-get install -y \
build-essential \
python3-dev \
unzip \
wget \
zip \
zlib1g \
zlib1g-dev \
gnupg \
rsync \
python3-pip \
python3-venv \
git \
sudo \
# Adding libGL (used by a few common nodes)
libgl1 \
libglib2.0-0 \
# Adding FFMPEG (for video generation workflow)
ffmpeg \
&& apt-get clean

ENV BUILD_FILE="/etc/image_base.txt"
ARG BASE_DOCKER_FROM
RUN echo "DOCKER_FROM: ${BASE_DOCKER_FROM}" | tee ${BUILD_FILE}
RUN echo "CUDNN: ${NV_CUDNN_PACKAGE_NAME} (${NV_CUDNN_VERSION})" | tee -a ${BUILD_FILE}

ARG BUILD_BASE="unknown"
LABEL comfyui-nvidia-docker-build-from=${BUILD_BASE}
RUN it="/etc/build_base.txt"; echo ${BUILD_BASE} > $it && chmod 555 $it

##### ComfyUI preparation
# The comfy user will have UID 1024 and GID 1024
ENV COMFYUSER_DIR="/comfy"
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers \
&& useradd -u 1024 -U -d ${COMFYUSER_DIR} -s /bin/bash -m comfy \
&& usermod -G users comfy \
&& adduser comfy sudo \
&& test -d ${COMFYUSER_DIR}
RUN it="/etc/comfyuser_dir"; echo ${COMFYUSER_DIR} > $it && chmod 555 $it

ENV NVIDIA_VISIBLE_DEVICES=all

EXPOSE 8188

USER comfy
WORKDIR ${COMFYUSER_DIR}
COPY --chown=comfy:comfy --chmod=555 init.bash comfyui-nvidia_init.bash

ARG BUILD_DATE="unknown"
LABEL comfyui-nvidia-docker-build=${BUILD_DATE}

CMD [ "./comfyui-nvidia_init.bash" ]
88 changes: 88 additions & 0 deletions Dockerfile/Dockerfile-ubuntu24_cuda12.5.1
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
FROM nvidia/cuda:12.5.1-runtime-ubuntu24.04

# Extended from https://gitlab.com/nvidia/container-images/cuda/-/blob/master/dist/12.5.1/ubuntu2404/runtime/Dockerfile
ENV NV_CUDNN_VERSION=9.3.0.75-1
ENV NV_CUDNN_PACKAGE_NAME="libcudnn9"
ENV NV_CUDA_ADD=cuda-12
ENV NV_CUDNN_PACKAGE="$NV_CUDNN_PACKAGE_NAME-$NV_CUDA_ADD=$NV_CUDNN_VERSION"

LABEL com.nvidia.cudnn.version="${NV_CUDNN_VERSION}"

RUN apt-get update && apt-get install -y --no-install-recommends \
${NV_CUDNN_PACKAGE} \
&& apt-mark hold ${NV_CUDNN_PACKAGE_NAME}-${NV_CUDA_ADD}

ARG BASE_DOCKER_FROM=nvidia/cuda:12.5.1-runtime-ubuntu24.04

##### Base

# Install system packages
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update -y --fix-missing\
&& apt-get install -y \
apt-utils \
locales \
ca-certificates \
&& apt-get upgrade -y \
&& apt-get clean

# UTF-8
RUN localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
ENV LANG=en_US.utf8
ENV LC_ALL=C

# Install needed packages
RUN apt-get update -y --fix-missing \
&& apt-get upgrade -y \
&& apt-get install -y \
build-essential \
python3-dev \
unzip \
wget \
zip \
zlib1g \
zlib1g-dev \
gnupg \
rsync \
python3-pip \
python3-venv \
git \
sudo \
# Adding libGL (used by a few common nodes)
libgl1 \
libglib2.0-0 \
# Adding FFMPEG (for video generation workflow)
ffmpeg \
&& apt-get clean

ENV BUILD_FILE="/etc/image_base.txt"
ARG BASE_DOCKER_FROM
RUN echo "DOCKER_FROM: ${BASE_DOCKER_FROM}" | tee ${BUILD_FILE}
RUN echo "CUDNN: ${NV_CUDNN_PACKAGE_NAME} (${NV_CUDNN_VERSION})" | tee -a ${BUILD_FILE}

ARG BUILD_BASE="unknown"
LABEL comfyui-nvidia-docker-build-from=${BUILD_BASE}
RUN it="/etc/build_base.txt"; echo ${BUILD_BASE} > $it && chmod 555 $it

##### ComfyUI preparation
# The comfy user will have UID 1024 and GID 1024
ENV COMFYUSER_DIR="/comfy"
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers \
&& useradd -u 1024 -U -d ${COMFYUSER_DIR} -s /bin/bash -m comfy \
&& usermod -G users comfy \
&& adduser comfy sudo \
&& test -d ${COMFYUSER_DIR}
RUN it="/etc/comfyuser_dir"; echo ${COMFYUSER_DIR} > $it && chmod 555 $it

ENV NVIDIA_VISIBLE_DEVICES=all

EXPOSE 8188

USER comfy
WORKDIR ${COMFYUSER_DIR}
COPY --chown=comfy:comfy --chmod=555 init.bash comfyui-nvidia_init.bash

ARG BUILD_DATE="unknown"
LABEL comfyui-nvidia-docker-build=${BUILD_DATE}

CMD [ "./comfyui-nvidia_init.bash" ]
141 changes: 86 additions & 55 deletions Makefile
Original file line number Diff line number Diff line change
@@ -2,90 +2,121 @@ SHELL := /bin/bash
.PHONY: all

DOCKER_CMD=docker

DOCKER_FROM=nvidia/cuda:12.3.2-runtime-ubuntu22.04

BUILD_DATE=$(shell printf '%(%Y%m%d_%H%M)T' -1)
BUILD_BASE=ubuntu22_cuda12.3

COMFYUI_CONTAINER_NAME=comfyui-nvidia-docker
BUILD_TAG=${BUILD_BASE}-latest
NAMED_BUILD=${COMFYUI_CONTAINER_NAME}:${BUILD_TAG}
NAMED_BUILD_LATEST=${COMFYUI_CONTAINER_NAME}:latest

DOCKERFILE=Dockerfile
DOCKER_PRE="NVIDIA_VISIBLE_DEVICES=all"
DOCKER_BUILD_ARGS=
##DOCKER_BUILD_ARGS="--no-cache"

#BUILD_DATE=$(shell printf '%(%Y%m%d)T' -1)
BUILD_DATE=20250116

DOCKER_BUILD_ARGS=
#DOCKER_BUILD_ARGS="--no-cache"
COMFYUI_CONTAINER_NAME=comfyui-nvidia-docker

# Set to False to make it less verbose
VERBOSE_PRINT=True
COMPONENTS_DIR=components
DOCKERFILE_DIR=Dockerfile

#####
# Get the list of all the base- files in COMPONENTS_DIR
DOCKER_ALL=$(shell ls -1 ${COMPONENTS_DIR}/base-* | perl -pe 's%^.+/base-%%' | sort)

all:
@echo "** Available Docker images to be built (make targets):"
@echo "latest: builds ${NAMED_BUILD} and tags it as ${NAMED_BUILD_LATEST}"
@if [ `echo ${DOCKER_ALL} | wc -w` -eq 0 ]; then echo "No images candidates to build"; exit 1; fi
@echo "Available ${COMFYUI_CONTAINER_NAME} ${DOCKER_CMD} images to be built (make targets):"
@echo -n " "; echo ${DOCKER_ALL} | sed -e 's/ /\n /g'
@echo ""
@echo "build: builds latest"

##### latest
@echo "build: builds all"

build:
@make latest
build: ${DOCKER_ALL}

${DOCKERFILE_DIR}:
@mkdir -p ${DOCKERFILE_DIR}

latest:
@VAR_NT=${COMFYUI_CONTAINER_NAME}-${BUILD_TAG} USED_BUILD=${NAMED_BUILD} USED_BUILD_LATEST=${NAMED_BUILD_LATEST} make build_main_actual


build_main_actual:
@echo "== [${USED_BUILD}] =="
${DOCKER_ALL}: ${DOCKERFILE_DIR}
@echo ""; echo ""; echo "===== Building ${COMFYUI_CONTAINER_NAME}:$@"
@cat ${COMPONENTS_DIR}/base-$@ > ${DOCKERFILE_DIR}/Dockerfile-$@
@cat ${COMPONENTS_DIR}/part1-common >> ${DOCKERFILE_DIR}/Dockerfile-$@
@$(eval VAR_NT="${COMFYUI_CONTAINER_NAME}-$@")
@echo "-- Docker command to be run:"
@echo "BUILDX_EXPERIMENTAL=1 ${DOCKER_PRE} docker buildx debug --on=error build --progress plain --platform linux/amd64 ${DOCKER_BUILD_ARGS} \\" > ${VAR_NT}.cmd
@echo " --build-arg DOCKER_FROM=\"${DOCKER_FROM}\" \\" >> ${VAR_NT}.cmd
@echo " --build-arg BASE_DOCKER_FROM=\"${DOCKER_FROM}\" \\" >> ${VAR_NT}.cmd
@echo "docker buildx ls | grep -q ${COMFYUI_CONTAINER_NAME} && echo \"builder already exists -- to delete it, use: docker buildx rm ${COMFYUI_CONTAINER_NAME}\" || docker buildx create --name ${COMFYUI_CONTAINER_NAME}" > ${VAR_NT}.cmd
@echo "docker buildx use ${COMFYUI_CONTAINER_NAME} || exit 1" >> ${VAR_NT}.cmd
@echo "BUILDX_EXPERIMENTAL=1 ${DOCKER_PRE} docker buildx debug --on=error build --progress plain --platform linux/amd64 ${DOCKER_BUILD_ARGS} \\" >> ${VAR_NT}.cmd
@echo " --build-arg BUILD_DATE=\"${BUILD_DATE}\" \\" >> ${VAR_NT}.cmd
@echo " --build-arg BUILD_BASE=\"${BUILD_BASE}\" \\" >> ${VAR_NT}.cmd
@echo " --tag=\"${USED_BUILD}\" \\" >> ${VAR_NT}.cmd
@echo " -f ${DOCKERFILE} \\" >> ${VAR_NT}.cmd
@echo " --build-arg BUILD_BASE=\"$@\" \\" >> ${VAR_NT}.cmd
@echo " --tag=\"${COMFYUI_CONTAINER_NAME}:$@\" \\" >> ${VAR_NT}.cmd
@echo " -f ${DOCKERFILE_DIR}/Dockerfile-$@ \\" >> ${VAR_NT}.cmd
@echo " --load \\" >> ${VAR_NT}.cmd
@echo " ." >> ${VAR_NT}.cmd

@cat ${VAR_NT}.cmd | tee ${VAR_NT}.log.temp
@echo "" | tee -a ${VAR_NT}.log.temp
@echo "Press Ctl+c within 5 seconds to cancel"
@for i in 5 4 3 2 1; do echo -n "$$i "; sleep 1; done; echo ""
# Actual build
@chmod +x ./${VAR_NT}.cmd
@script -a -e -c ./${VAR_NT}.cmd ${VAR_NT}.log.temp; exit "$${PIPESTATUS[0]}"

@mv ${VAR_NT}.log.temp ${VAR_NT}.log
@rm -f ./${VAR_NT}.cmd

@${DOCKER_CMD} tag ${USED_BUILD} ${USED_BUILD_LATEST}
###### clean

docker_tag_list:
@${DOCKER_CMD} images --filter "label=comfyui-nvidia-docker-build"

docker_buildx_rm:
@docker buildx rm ${COMFYUI_CONTAINER_NAME}

##### clean
# Get the list of all existing Docker images
DOCKERHUB_REPO="mmartial"
DOCKER_PRESENT=$(shell for i in ${DOCKER_ALL}; do image="${COMFYUI_CONTAINER_NAME}:$$i"; if docker images --format "{{.Repository}}:{{.Tag}}" | grep -v ${DOCKERHUB_REPO} | grep -q $$image; then echo $$image; fi; done)

docker_rmi:
docker rmi --force ${NAMED_BUILD} ${DOCKERHUB_REPO}/${NAMED_BUILD} ${NAMED_BUILD_LATEST} ${DOCKERHUB_REPO}/${NAMED_BUILD_LATEST}
@echo -n "== Images to delete: "
@echo ${DOCKER_PRESENT} | wc -w
@if [ `echo ${DOCKER_PRESENT} | wc -w` -eq 0 ]; then echo "No images to delete"; exit 1; fi
@echo ${DOCKER_PRESENT} | sed -e 's/ /\n/g'
@echo ""
@echo "Press Ctl+c within 5 seconds to cancel"
@for i in 5 4 3 2 1; do echo -n "$$i "; sleep 1; done; echo ""
@for i in ${DOCKER_PRESENT}; do docker rmi $$i; done
@echo ""; echo " ** Remaining image with the build label:"
@make docker_tag_list


############################################## For maintainer only
##### push
DOCKERHUB_REPO="mmartial"
############################################### For maintainer only
###### push -- will only proceed with existing ("present") images

LATEST_ENTRY=$(shell echo ${DOCKER_ALL} | sed -e 's/ /\n/g' | tail -1)
LATEST_CANDIDATE=$(shell echo ${COMFYUI_CONTAINER_NAME}:${LATEST_ENTRY})

docker_tag:
@make latest
@${DOCKER_CMD} tag ${NAMED_BUILD} ${DOCKERHUB_REPO}/${NAMED_BUILD}
@${DOCKER_CMD} tag ${NAMED_BUILD_LATEST} ${DOCKERHUB_REPO}/${NAMED_BUILD_LATEST}
@make docker_tag_list
@if [ `echo ${DOCKER_PRESENT} | wc -w` -eq 0 ]; then echo "No images to tag"; exit 1; fi
@echo "== About to tag:"
@for i in ${DOCKER_PRESENT}; do image_out1="${DOCKERHUB_REPO}/$$i-${BUILD_DATE}"; image_out2="${DOCKERHUB_REPO}/$$i-latest"; echo " ++ $$i -> $$image_out1"; echo " ++ $$i -> $$image_out2"; done
@if echo ${DOCKER_PRESENT} | grep -q ${LATEST_CANDIDATE}; then image_out="${DOCKERHUB_REPO}/${COMFYUI_CONTAINER_NAME}:latest"; echo " ++ ${LATEST_CANDIDATE} -> $$image_out"; else echo " -- Unable to find latest candidate: ${LATEST_CANDIDATE}"; fi
@echo ""
@echo "tagging for hub.docker.com upload -- Press Ctl+c within 5 seconds to cancel"
@for i in 5 4 3 2 1; do echo -n "$$i "; sleep 1; done; echo ""
@for i in ${DOCKER_PRESENT}; do image_out1="${DOCKERHUB_REPO}/$$i-${BUILD_DATE}"; image_out2="${DOCKERHUB_REPO}/$$i-latest"; docker tag $$i $$image_out1; docker tag $$i $$image_out2; done
@if echo ${DOCKER_PRESENT} | grep -q ${LATEST_CANDIDATE}; then image_out="${DOCKERHUB_REPO}/${COMFYUI_CONTAINER_NAME}:latest"; docker tag ${LATEST_CANDIDATE} $$image_out; fi

DOCKERHUB_READY=$(shell for i in ${DOCKER_ALL}; do image="${DOCKERHUB_REPO}/${COMFYUI_CONTAINER_NAME}:$$i"; image1=$$image-${BUILD_DATE}; image2=$$image-latest; if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q $$image1; then echo $$image1; fi; if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q $$image2; then echo $$image2; fi; done)
DOCKERHUB_READY_LATEST=$(shell image="${DOCKERHUB_REPO}/${COMFYUI_CONTAINER_NAME}:latest"; if docker images --format "{{.Repository}}:{{.Tag}}" | grep -q $$image; then echo $$image; else echo ""; fi)

docker_tag_list:
@echo "Docker images tagged:"
@${DOCKER_CMD} images --filter "label=comfyui-nvidia-docker-build"

docker_push:
@make docker_tag
@echo "hub.docker.com upload -- Press Ctl+c within 5 seconds to cancel -- will only work for maintainers"
@if [ `echo ${DOCKERHUB_READY} | wc -w` -eq 0 ]; then echo "No images to push"; exit 1; fi
@echo "== About to push:"
@for i in ${DOCKERHUB_READY} ${DOCKERHUB_READY_LATEST}; do echo " ++ $$i"; done
@echo "pushing to hub.docker.com -- Press Ctl+c within 5 seconds to cancel"
@for i in 5 4 3 2 1; do echo -n "$$i "; sleep 1; done; echo ""
@for i in ${DOCKERHUB_READY} ${DOCKERHUB_READY_LATEST}; do docker push $$i; done


docker_rmi_hub:
@echo ""; echo " ** Potential images with the build label:"
@make docker_tag_list
@if [ `echo ${DOCKERHUB_READY} ${DOCKERHUB_READY_LATEST} | wc -w` -eq 0 ]; then echo "No expected images to delete"; exit 1; fi
@echo "== About to delete:"
@for i in ${DOCKERHUB_READY} ${DOCKERHUB_READY_LATEST}; do echo " -- $$i"; done
@echo "deleting -- Press Ctl+c within 5 seconds to cancel"
@for i in 5 4 3 2 1; do echo -n "$$i "; sleep 1; done; echo ""
@${DOCKER_CMD} push ${DOCKERHUB_REPO}/${NAMED_BUILD}
@${DOCKER_CMD} push ${DOCKERHUB_REPO}/${NAMED_BUILD_LATEST}
@for i in ${DOCKERHUB_READY} ${DOCKERHUB_READY_LATEST}; do docker rmi $$i; done
@echo ""; echo " ** Remaining images with the build label:"
@make docker_tag_list
Loading

0 comments on commit 4d70f24

Please sign in to comment.