# ==================== Python Build Base ==================== FROM ghcr.io/storytold/docker-base-images-nvidia-cuda-experimental:080f96bc7087 as pybuild-base ## Authenticating with GHCR locally: ## https://docs.github.com/en/packages/working-with-a-github-packages-registry/migrating-to-the-container-registry-from-the-docker-registry ## ``` ## export CR_PAT=YOUR_TOKEN ## echo $CR_PAT | docker login ghcr.io -u USERNAME --password-stdin ## ``` # ##FROM nvidia/cuda:10.1-devel-ubuntu18.04 as pybuild-base #FROM nvidia/cuda:11.3.0-devel-ubuntu20.04 as pybuild-base # ## tzdata install hangs without presetting the time zone #ENV TZ=UTC #RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # ## NB(2021-05-30): This is the image that Tacotron 2's Dockerfile specifies. ## I have not tried this, but it might be necessary. ##FROM pytorch/pytorch:nightly-devel-cuda10.0-cudnn7 ##ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH} # ## NB: https://github.com/NVIDIA/nvidia-docker/issues/864#issuecomment-439848887 ## NB: We do not install ffmpeg, since the version is 3.8.* series and we need 4.2.* ## ## NB(2021-05-30): We need to install `cython3` for building modern Tacotron 2 ## dependencies (ie. protoc) on old Ubuntu ## RUN apt-get update \ ## && apt-get install -y \ #RUN apt-get update ##RUN apt-cache search python3.8 # ## NB: Here we install nvidia drivers ## NB: Avoid keyboard prompt #RUN DEBIAN_FRONTEND=noninteractive apt-get install -y nvidia-384 --no-install-recommends # ## ffmpeg version 4.2.4-1ubuntu0.1 Copyright (c) 2000-2020 the FFmpeg developers ##RUN apt-get install -y ffmpeg ##RUN ffmpeg -version ##RUN sleep 100 # ## Notes on packages: ## * software-properties-common - needed for `apt-add-repository` ## * pciutils - needed for `lspci | grep -i nvidia` #RUN apt-get install -y \ # build-essential \ # curl \ # cython3 \ # ffmpeg \ # g++-7 \ # gcc-7 \ # git \ # htop \ # imagemagick \ # libc++-7-dev \ # libffi-dev \ # libgcc-7-dev \ # libmagic1 \ # libsm6 \ # libsndfile1 \ # libssl-dev \ # libxext6 \ # libxrender-dev \ # netcat \ # pciutils \ # python-dev \ # python3-pip \ # python3.8 \ # python3.8-dev \ # python3.8-venv\ # redis-tools \ # silversearcher-ag \ # software-properties-common \ # sox \ # tmux \ # vim \ # wget # # ## Wav2Lip needs Python3.6 ## NB: we install python3-virtualenv as `python3.6 -m venv` won't work anymore #RUN add-apt-repository ppa:deadsnakes/ppa #RUN apt-get update #RUN apt-get install -y python3.6 #RUN apt-get install -y python3-virtualenv #RUN apt-get install -y python3.6-venv #RUN apt-get install -y python3.6-dev ##RUN apt-get install python3-virtualenv # # #RUN python3.6 --version #RUN python3.8 --version # We need ffmpeg version >= 4.2 (https://superuser.com/a/579110) # http://ubuntuhandbook.org/index.php/2020/06/install-ffmpeg-4-3-via-ppa-ubuntu-18-04-16-04/ #RUN apt-get install -y software-properties-common \ # && add-apt-repository ppa:jonathonf/ffmpeg-4 \ # && apt-get update \ # && apt-get install -y ffmpeg # # The downloader needs youtube-dl as a python library # NB: No longer maintained: https://news.ycombinator.com/item?id=28319624 #RUN pip3 install --upgrade youtube-dl # Used by the downloader script. # And it looks like youtube-dl is dead... # Per the README, it looks like pip will always pull the latest version. # https://github.com/yt-dlp/yt-dlp#update RUN python3 -m pip install --upgrade yt-dlp # ==================== Python Build Step 2: Wav2Lip Requirements ==================== FROM pybuild-base as pybuild-requirements WORKDIR / COPY models/Wav2Lip ./models/Wav2Lip WORKDIR models/Wav2Lip # NB: We need Python3.6 RUN python3.6 -m venv python #RUN virtualenv -p /usr/bin/python3.6 ... wait RUN . python/bin/activate \ && pip install --upgrade pip \ && pip install -r requirements.txt \ && deactivate WORKDIR / COPY models/tts ./models/tts WORKDIR models/tts # NB: Not sure if we need Python3.6 for Tacotron2, but Python3.8 gave me trouble. # NB: Setuptools fix: https://github.com/tensorflow/tensorflow/issues/34302#issuecomment-554450289 RUN python3.6 -m venv python RUN . python/bin/activate \ && pip install --upgrade pip setuptools \ && pip install -r requirements-tacotron-python36.txt \ && deactivate # ==================== Rust Build Base ==================== # Custom base image # Make sure to add this repository so it has read acces to the base image: # https://github.com/orgs/storytold/packages/container/docker-base-images-rust-ssl/settings/actions_access FROM ghcr.io/storytold/docker-base-images-rust-ssl:latest as rust-build WORKDIR /tmp COPY Cargo.lock . COPY Cargo.toml . COPY sqlx-data.json . COPY crates/ ./crates COPY db/ ./db # TODO(2022-01-16): Might not be necessary: # COPY _migrations/ ./_migrations RUN $HOME/.cargo/bin/cargo fetch # Build all the binaries. RUN SQLX_OFFLINE=true \ LD_LIBRARY_PATH=/usr/lib:${LD_LIBRARY_PATH} \ $HOME/.cargo/bin/cargo build \ --release \ --bin storyteller-web RUN SQLX_OFFLINE=true \ LD_LIBRARY_PATH=/usr/lib:${LD_LIBRARY_PATH} \ $HOME/.cargo/bin/cargo build \ --release \ --bin tts-download-job RUN SQLX_OFFLINE=true \ LD_LIBRARY_PATH=/usr/lib:${LD_LIBRARY_PATH} \ $HOME/.cargo/bin/cargo build \ --release \ --bin w2l-download-job RUN SQLX_OFFLINE=true \ LD_LIBRARY_PATH=/usr/lib:${LD_LIBRARY_PATH} \ $HOME/.cargo/bin/cargo build \ --release \ --bin tts-inference-job RUN SQLX_OFFLINE=true \ LD_LIBRARY_PATH=/usr/lib:${LD_LIBRARY_PATH} \ $HOME/.cargo/bin/cargo build \ --release \ --bin w2l-inference-job RUN SQLX_OFFLINE=true \ LD_LIBRARY_PATH=/usr/lib:${LD_LIBRARY_PATH} \ $HOME/.cargo/bin/cargo build \ --release \ --bin websocket-gateway RUN SQLX_OFFLINE=true \ LD_LIBRARY_PATH=/usr/lib:${LD_LIBRARY_PATH} \ $HOME/.cargo/bin/cargo build \ --release \ --bin twitch-pubsub-subscriber # Final image # FROM ubuntu:xenial FROM pybuild-requirements as final #RUN mkdir /storyteller #WORKDIR /storyteller WORKDIR / COPY scripts/ ./scripts # See: https://github.com/opencontainers/image-spec/blob/master/annotations.md LABEL org.opencontainers.image.authors='bt@brand.io, echelon@gmail.com' LABEL org.opencontainers.image.url='https://github.com/storytold/storyteller-web' LABEL org.opencontainers.image.documentation='https://github.com/storytold/storyteller-web' LABEL org.opencontainers.image.source='https://github.com/storytold/storyteller-web' # NB(echelon,2022-05-31): NVIDIA revoked some of their keys. # A better long term fix is to remove these dependencies outright and not have ML deps in this repo. # https://developer.nvidia.com/blog/updating-the-cuda-linux-gpg-repository-key/ # https://forums.developer.nvidia.com/t/invalid-public-key-for-cuda-apt-repository/212901/11 RUN apt-key del 7fa2af80 # NB: Fix for 'E: Conflicting values set for option Signed-By regarding source' # NB: We need to remove all sources RUN rm $(find /etc/apt | grep cuda) #RUN wget https://developer.download.nvidia.com/compute/cuda/repos/$distro/$arch/cuda-keyring_1.0-1_all.deb RUN wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.0-1_all.deb RUN dpkg -i cuda-keyring_1.0-1_all.deb # NB: Comment this out for non-debug images # TODO: Figure out how this is done elsewhere with just the static binaries # Others: `mysql-client` RUN apt-get update \ && apt-get install -y \ curl \ python3-pip \ python3 \ wget RUN python3 --version #RUN python3.7 -m venv python #RUN . python/bin/activate \ # && pip install --upgrade pip \ # && pip install -r requirements.txt # TODO: Use venv to do this instead. RUN pip3 install gdown # Copy all the binaries. COPY --from=rust-build /tmp/target/release/storyteller-web / COPY --from=rust-build /tmp/target/release/tts-download-job / COPY --from=rust-build /tmp/target/release/tts-inference-job / COPY --from=rust-build /tmp/target/release/w2l-download-job / COPY --from=rust-build /tmp/target/release/w2l-inference-job / COPY --from=rust-build /tmp/target/release/websocket-gateway / COPY --from=rust-build /tmp/target/release/twitch-pubsub-subscriber / # SSL certs are required for crypto COPY --from=rust-build /etc/ssl /etc/ssl # Required dynamically linked libraries COPY --from=rust-build /lib/x86_64-linux-gnu/libssl.* /lib/x86_64-linux-gnu/ COPY --from=rust-build /lib/x86_64-linux-gnu/libcrypto.* /lib/x86_64-linux-gnu/ # Make sure all the links resolve RUN ldd storyteller-web # Without a .env file, Rust crashes "mysteriously" (ugh) RUN touch .env RUN touch .env-secrets EXPOSE 8080 CMD LD_LIBRARY_PATH=/usr/lib /storyteller-web # =================================================================================================== # WAV2LIP WORKER # ==================== Rust Build Base ==================== # #FROM ubuntu:xenial as rustbuild-base # WORKDIR /tmp # RUN apt-get update \ # && apt-get install -y \ # build-essential \ # curl \ # libssl-dev \ # libssl1.0.0 \ # pkg-config \ # unzip \ # wget # RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ # | sh -s -- --default-toolchain stable -y # ==================== Rust Build Binary ==================== # FROM rustbuild-base as rustbuild-binary # # COPY Cargo.lock . # COPY Cargo.toml . # COPY w2l_server ./w2l_server # COPY w2l_shared ./w2l_shared # COPY w2l_worker ./w2l_worker # # RUN $HOME/.cargo/bin/cargo fetch # RUN LD_LIBRARY_PATH=/usr/lib:${LD_LIBRARY_PATH} $HOME/.cargo/bin/cargo build --release --bin wav2lip_worker # ==================== Final Image ==================== # FROM pybuild-requirements as final # WORKDIR / # # COPY --from=rustbuild-binary /tmp/target/release/wav2lip_worker / # COPY --from=rustbuild-binary /etc/ssl /etc/ssl # COPY --from=rustbuild-binary /lib/x86_64-linux-gnu/libssl.* /lib/x86_64-linux-gnu/ # COPY --from=rustbuild-binary /lib/x86_64-linux-gnu/libcrypto.* /lib/x86_64-linux-gnu/ # # # Without a .env file, Rust crashes "mysteriously" (ugh) # RUN touch .env # # RUN ldd wav2lip_worker # # EXPOSE 8080 # CMD LD_LIBRARY_PATH=/usr/lib /wav2lip_worker