diff --git a/.dockerignore b/.dockerignore index 81301571b8..0c177e5912 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,10 +4,6 @@ !ldm !pyproject.toml -# Guard against pulling in any models that might exist in the directory tree -**/*.pt* -**/*.ckpt - # ignore frontend but whitelist dist invokeai/frontend/ !invokeai/frontend/dist/ @@ -16,10 +12,14 @@ invokeai/frontend/ invokeai/assets/ !invokeai/assets/web/ +# Guard against pulling in any models that might exist in the directory tree +**/*.pt* +**/*.ckpt + # Byte-compiled / optimized / DLL files **/__pycache__/ **/*.py[cod] # Distribution / packaging -*.egg-info/ -*.egg +**/*.egg-info/ +**/*.egg diff --git a/.github/workflows/build-container.yml b/.github/workflows/build-container.yml index 5a8ccdcc1d..efff1d2f8a 100644 --- a/.github/workflows/build-container.yml +++ b/.github/workflows/build-container.yml @@ -5,6 +5,8 @@ on: - 'main' - 'update/ci/docker/*' - 'update/docker/*' + - 'dev/ci/docker/*' + - 'dev/docker/*' paths: - 'pyproject.toml' - 'ldm/**' @@ -24,11 +26,11 @@ jobs: fail-fast: false matrix: flavor: - - amd + - rocm - cuda - cpu include: - - flavor: amd + - flavor: rocm pip-extra-index-url: 'https://download.pytorch.org/whl/rocm5.2' - flavor: cuda pip-extra-index-url: '' diff --git a/docker/Dockerfile b/docker/Dockerfile index 230c7e584e..2c3320cc0f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -4,15 +4,15 @@ ARG PYTHON_VERSION=3.9 ################## ## base image ## ################## -FROM python:${PYTHON_VERSION}-slim AS python-base +FROM --platform=${TARGETPLATFORM} python:${PYTHON_VERSION}-slim AS python-base LABEL org.opencontainers.image.authors="mauwii@outlook.de" -# prepare for buildkit cache +# Prepare apt for buildkit cache RUN rm -f /etc/apt/apt.conf.d/docker-clean \ && echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' >/etc/apt/apt.conf.d/keep-cache -# Install necessary packages +# Install dependencies RUN \ --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ @@ -23,7 +23,7 @@ RUN \ libglib2.0-0=2.66.* \ libopencv-dev=4.5.* -# set working directory and env +# Set working directory and env ARG APPDIR=/usr/src ARG APPNAME=InvokeAI WORKDIR ${APPDIR} @@ -32,7 +32,7 @@ ENV PATH ${APPDIR}/${APPNAME}/bin:$PATH ENV PYTHONDONTWRITEBYTECODE 1 # Turns off buffering for easier container logging ENV PYTHONUNBUFFERED 1 -# don't fall back to legacy build system +# Don't fall back to legacy build system ENV PIP_USE_PEP517=1 ####################### @@ -40,7 +40,7 @@ ENV PIP_USE_PEP517=1 ####################### FROM python-base AS pyproject-builder -# Install dependencies +# Install build dependencies RUN \ --mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \ @@ -51,26 +51,30 @@ RUN \ gcc=4:10.2.* \ python3-dev=3.9.* -# prepare pip for buildkit cache +# Prepare pip for buildkit cache ARG PIP_CACHE_DIR=/var/cache/buildkit/pip ENV PIP_CACHE_DIR ${PIP_CACHE_DIR} RUN mkdir -p ${PIP_CACHE_DIR} -# create virtual environment -RUN --mount=type=cache,target=${PIP_CACHE_DIR},sharing=locked \ +# Create virtual environment +RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ python3 -m venv "${APPNAME}" \ --upgrade-deps -# copy sources -COPY --link . . - -# install pyproject.toml +# Install requirements +COPY --link pyproject.toml . +COPY --link ldm/invoke/_version.py ldm/invoke/__init__.py ldm/invoke/ ARG PIP_EXTRA_INDEX_URL ENV PIP_EXTRA_INDEX_URL ${PIP_EXTRA_INDEX_URL} -RUN --mount=type=cache,target=${PIP_CACHE_DIR},sharing=locked \ +RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ + "${APPNAME}"/bin/pip install . + +# Install pyproject.toml +COPY --link . . +RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ "${APPNAME}/bin/pip" install . -# build patchmatch +# Build patchmatch RUN python3 -c "from patchmatch import patch_match" ##################### @@ -86,14 +90,14 @@ RUN useradd \ -U \ "${UNAME}" -# create volume directory +# Create volume directory ARG VOLUME_DIR=/data RUN mkdir -p "${VOLUME_DIR}" \ - && chown -R "${UNAME}" "${VOLUME_DIR}" + && chown -hR "${UNAME}:${UNAME}" "${VOLUME_DIR}" -# setup runtime environment -USER ${UNAME} -COPY --chown=${UNAME} --from=pyproject-builder ${APPDIR}/${APPNAME} ${APPNAME} +# Setup runtime environment +USER ${UNAME}:${UNAME} +COPY --chown=${UNAME}:${UNAME} --from=pyproject-builder ${APPDIR}/${APPNAME} ${APPNAME} ENV INVOKEAI_ROOT ${VOLUME_DIR} ENV TRANSFORMERS_CACHE ${VOLUME_DIR}/.cache ENV INVOKE_MODEL_RECONFIGURE "--yes --default_only" diff --git a/docker/build.sh b/docker/build.sh index 21108d2d21..8bfb9a9ddc 100755 --- a/docker/build.sh +++ b/docker/build.sh @@ -41,7 +41,7 @@ else fi # Build Container -DOCKER_BUILDKIT=1 docker build \ +docker build \ --platform="${PLATFORM:-linux/amd64}" \ --tag="${CONTAINER_IMAGE:-invokeai}" \ ${CONTAINER_FLAVOR:+--build-arg="CONTAINER_FLAVOR=${CONTAINER_FLAVOR}"} \ diff --git a/docker/env.sh b/docker/env.sh index 6eecb24e8e..ee3b54f5f6 100644 --- a/docker/env.sh +++ b/docker/env.sh @@ -49,3 +49,6 @@ CONTAINER_FLAVOR="${CONTAINER_FLAVOR-cuda}" CONTAINER_TAG="${CONTAINER_TAG-"${INVOKEAI_BRANCH##*/}-${CONTAINER_FLAVOR}"}" CONTAINER_IMAGE="${CONTAINER_REGISTRY}/${CONTAINER_REPOSITORY}:${CONTAINER_TAG}" CONTAINER_IMAGE="${CONTAINER_IMAGE,,}" + +# enable docker buildkit +export DOCKER_BUILDKIT=1 diff --git a/docker/run.sh b/docker/run.sh index c52ccb4c4d..d685788146 100755 --- a/docker/run.sh +++ b/docker/run.sh @@ -21,10 +21,10 @@ docker run \ --tty \ --rm \ --platform="${PLATFORM}" \ - --name="${REPOSITORY_NAME,,}" \ - --hostname="${REPOSITORY_NAME,,}" \ - --mount=source="${VOLUMENAME}",target=/data \ - --mount type=bind,source="$(pwd)"/outputs,target=/data/outputs \ + --name="${REPOSITORY_NAME}" \ + --hostname="${REPOSITORY_NAME}" \ + --mount type=volume,volume-driver=local,source="${VOLUMENAME}",target=/data \ + --mount type=bind,source="$(pwd)"/outputs/,target=/data/outputs/ \ ${MODELSPATH:+--mount="type=bind,source=${MODELSPATH},target=/data/models"} \ ${HUGGING_FACE_HUB_TOKEN:+--env="HUGGING_FACE_HUB_TOKEN=${HUGGING_FACE_HUB_TOKEN}"} \ --publish=9090:9090 \ @@ -32,7 +32,7 @@ docker run \ ${GPU_FLAGS:+--gpus="${GPU_FLAGS}"} \ "${CONTAINER_IMAGE}" ${@:+$@} -# Remove Trash folder +echo -e "\nCleaning trash folder ..." for f in outputs/.Trash*; do if [ -e "$f" ]; then rm -Rf "$f"