From 7062353095f20e2efd56e1de4348184d747aedb8 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Thu, 11 Aug 2022 14:51:58 -0400 Subject: [PATCH 1/7] update docker --- .docker_platforms | 1 + .github/workflows/ci-docker.yml | 191 ++++++++++++++++++++++++++++++++ DOCKER_README.md | 18 +-- Dockerfile | 80 +++++++++++++ 4 files changed, 281 insertions(+), 9 deletions(-) create mode 100644 .docker_platforms create mode 100644 .github/workflows/ci-docker.yml create mode 100644 Dockerfile diff --git a/.docker_platforms b/.docker_platforms new file mode 100644 index 00000000000..11a8121d9e8 --- /dev/null +++ b/.docker_platforms @@ -0,0 +1 @@ +linux/amd64 \ No newline at end of file diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml new file mode 100644 index 00000000000..ed36038d1ed --- /dev/null +++ b/.github/workflows/ci-docker.yml @@ -0,0 +1,191 @@ +--- +# This action is centrally managed in https://github.com//.github/ +# Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in +# the above-mentioned repo. + +name: CI Docker + +on: + pull_request: + branches: [master, nightly] + types: [opened, synchronize, reopened] + push: + branches: [master, nightly] + workflow_dispatch: + +jobs: + check_dockerfile: + name: Check Dockerfile + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Check + id: check + run: | + if [ -f "./Dockerfile" ] + then + FOUND=true + else + FOUND=false + fi + + echo "::set-output name=dockerfile::${FOUND}" + + outputs: + dockerfile: ${{ steps.check.outputs.dockerfile }} + + lint_dockerfile: + name: Lint Dockerfile + needs: [check_dockerfile] + if: ${{ needs.check_dockerfile.outputs.dockerfile == 'true' }} + runs-on: ubuntu-latest + steps: + - name: Lint Dockerfile + uses: actions/checkout@v3 + + - uses: hadolint/hadolint-action@v2.1.0 + with: + dockerfile: ./Dockerfile + + check_changelog: + name: Check Changelog + needs: [check_dockerfile] + if: ${{ needs.check_dockerfile.outputs.dockerfile == 'true' }} + runs-on: ubuntu-latest + steps: + - name: Checkout + if: ${{ github.ref == 'refs/heads/master' || github.base_ref == 'master' }} + uses: actions/checkout@v3 + + - name: Verify Changelog + id: verify_changelog + if: ${{ github.ref == 'refs/heads/master' || github.base_ref == 'master' }} + # base_ref for pull request check, ref for push + uses: LizardByte/.github/actions/verify_changelog@master + with: + token: ${{ secrets.GITHUB_TOKEN }} + outputs: + next_version: ${{ steps.verify_changelog.outputs.changelog_parser_version }} + + docker: + name: Docker + needs: [check_dockerfile, check_changelog] + if: ${{ needs.check_dockerfile.outputs.dockerfile == 'true' }} + runs-on: ubuntu-latest + permissions: + packages: write + contents: write + + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Prepare + id: prepare + env: + NEXT_VERSION: ${{ needs.check_changelog.outputs.next_version }} + run: | + # get branch name + BRANCH=${GITHUB_HEAD_REF} + + if [ -z "$BRANCH" ] + then + echo "This is a PUSH event" + BRANCH=${{ github.ref_name }} + fi + + # determine to push image to dockerhub and ghcr or not + if [[ $GITHUB_EVENT_NAME == "push" ]]; then + PUSH=true + else + PUSH=false + fi + + # setup the tags + REPOSITORY=${{ github.repository }} + BASE_TAG=$(echo $REPOSITORY | tr '[:upper:]' '[:lower:]') + COMMIT=${{ github.sha }} + + TAGS="${BASE_TAG}:${COMMIT:0:7},ghcr.io/${BASE_TAG}:${COMMIT:0:7}" + + if [[ $GITHUB_REF == refs/heads/master ]]; then + TAGS="${TAGS},${BASE_TAG}:latest,ghcr.io/${BASE_TAG}:latest" + TAGS="${TAGS},${BASE_TAG}:master,ghcr.io/${BASE_TAG}:master" + elif [[ $GITHUB_REF == refs/heads/nightly ]]; then + TAGS="${TAGS},${BASE_TAG}:nightly,ghcr.io/${BASE_TAG}:nightly" + else + TAGS="${TAGS},${BASE_TAG}:test,ghcr.io/${BASE_TAG}:test" + fi + + if [[ ${NEXT_VERSION} != "" ]]; then + TAGS="${TAGS},${BASE_TAG}:${NEXT_VERSION},ghcr.io/${BASE_TAG}:${NEXT_VERSION}" + fi + + # read the platforms from `.docker_platforms` + PLATFORMS=$(<.docker_platforms) + + echo ::set-output name=branch::${BRANCH} + echo ::set-output name=build_date::$(date -u +'%Y-%m-%dT%H:%M:%SZ') + echo ::set-output name=commit::${COMMIT} + echo ::set-output name=platforms::${PLATFORMS} + echo ::set-output name=push::${PUSH} + echo ::set-output name=tags::${TAGS} + + - name: Set Up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + id: buildx + + - name: Cache Docker Layers + uses: actions/cache@v3 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + + - name: Log in to Docker Hub + if: ${{ steps.prepare.outputs.push == 'true' }} # PRs do not have access to secrets + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + + - name: Log in to the Container registry + if: ${{ steps.prepare.outputs.push == 'true' }} # PRs do not have access to secrets + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ secrets.GH_BOT_NAME }} + password: ${{ secrets.GH_BOT_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v3 + with: + context: ./ + file: ./Dockerfile + push: ${{ steps.prepare.outputs.push }} + platforms: ${{ steps.prepare.outputs.platforms }} + build-args: | + BRANCH=${{ steps.prepare.outputs.branch }} + COMMIT=${{ steps.prepare.outputs.commit }} + BUILD_DATE=${{ steps.prepare.outputs.build_date }} + tags: ${{ steps.prepare.outputs.tags }} + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache + + - name: Update Docker Hub Description + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} + uses: peter-evans/dockerhub-description@v3 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_PASSWORD }} # token is not currently supported + repository: ${{ env.BASE_TAG }} + short-description: ${{ github.event.repository.description }} + readme-filepath: ./DOCKER_README.md diff --git a/DOCKER_README.md b/DOCKER_README.md index a2647e00d75..5ca999abed8 100644 --- a/DOCKER_README.md +++ b/DOCKER_README.md @@ -48,9 +48,9 @@ services: - PGID= - TZ= ports: - - 47984-47990:47984-47990/tcp - - 48010:48010 - - 47998-48000:47998-48000/udp + - "47984-47990:47984-47990/tcp" + - "48010:48010" + - "47998-48000:47998-48000/udp" ``` Create and start the container (run the command from the same folder as your `docker-compose.yml` file): @@ -79,12 +79,12 @@ port `47990` (e.g. `http://:47990`). The internal port must be `47990`, (e.g. `-p 8080:47990`). All the ports listed in the `docker run` and `docker-compose` examples are required. -| Parameter | Function | Example Value | Required | -| --------------------------- | -------------------- | ------------------- | -------- | -| `-p :47990` | Web UI Port | `47990` | True | -| `-v :/config` | Volume mapping | `/home/sunshine` | True | -| `-e PUID=` | User ID | `1001` | False | -| `-e PGID=` | Group ID | `1001` | False | +| Parameter | Function | Example Value | Required | +|-----------------------------|--------------------------------------------------------------------------------------|--------------------|----------| +| `-p :47990` | Web UI Port | `47990` | True | +| `-v :/config` | Volume mapping | `/home/sunshine` | True | +| `-e PUID=` | User ID | `1001` | False | +| `-e PGID=` | Group ID | `1001` | False | | `-e TZ=` | Lookup TZ value [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) | `America/New_York` | True | ### User / Group Identifiers: diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000000..56415b51fa2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,80 @@ +FROM ubuntu:22.04 AS sunshine-base + +ARG DEBIAN_FRONTEND=noninteractive +ARG TZ="America/New_York" + +FROM sunshine-base as sunshine-build + +SHELL ["/bin/bash", "-o", "pipefail", "-c"] +RUN apt-get update -y \ + && apt-get install -y --no-install-recommends \ + build-essential \ + cmake \ + git \ + libavdevice-dev \ + libboost-filesystem-dev \ + libboost-log-dev \ + libboost-thread-dev \ + libcap-dev \ + libdrm-dev \ + libevdev-dev \ + libpulse-dev \ + libopus-dev \ + libssl-dev \ + libwayland-dev \ + libx11-dev \ + libxcb-shm0-dev \ + libxcb-xfixes0-dev \ + libxcb1-dev \ + libxfixes-dev \ + libxrandr-dev \ + libxtst-dev \ + nvidia-cuda-dev \ + nvidia-cuda-toolkit \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# copy repository +RUN mkdir /root/sunshine-build +WORKDIR /root/sunshine-build/ +COPY . . + +# setup build directory +RUN mkdir /root/sunshine-build/build +WORKDIR /root/sunshine-build/build + +# cmake and cpack +RUN cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/etc \ + -DSUNSHINE_ASSETS_DIR=sunshine/assets \ + -DSUNSHINE_CONFIG_DIR=sunshine/config \ + -DSUNSHINE_EXECUTABLE_PATH=/usr/bin/sunshine \ + -DSUNSHINE_ENABLE_WAYLAND=ON \ + -DSUNSHINE_ENABLE_X11=ON \ + -DSUNSHINE_ENABLE_DRM=ON \ + -DSUNSHINE_ENABLE_CUDA=ON \ + /root/sunshine-build \ + && make -j "$(nproc)" \ + && cpack -G DEB + +FROM sunshine-base as sunshine + +# copy deb from builder +COPY --from=sunshine-build /root/sunshine-build/build/cpack_artifacts/Sunshine.deb /sunshine.deb + +# install sunshine +RUN apt-get update -y \ + && apt-get install -y --no-install-recommends -f /sunshine.deb \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# network setup +EXPOSE 47984-47990/tcp +EXPOSE 48010 +EXPOSE 47998-48000/udp + +# setup config directory +RUN mkdir /config + +# entrypoint +ENTRYPOINT ["/usr/bin/sunshine", "/config/sunshine.conf"] From 24501e972d772f82f399db01ee50a14a7fdfaa83 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Thu, 11 Aug 2022 19:59:26 -0400 Subject: [PATCH 2/7] specify docker dependency versions --- Dockerfile | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/Dockerfile b/Dockerfile index 56415b51fa2..58e3e54075d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,29 +8,28 @@ FROM sunshine-base as sunshine-build SHELL ["/bin/bash", "-o", "pipefail", "-c"] RUN apt-get update -y \ && apt-get install -y --no-install-recommends \ - build-essential \ - cmake \ - git \ - libavdevice-dev \ - libboost-filesystem-dev \ - libboost-log-dev \ - libboost-thread-dev \ - libcap-dev \ - libdrm-dev \ - libevdev-dev \ - libpulse-dev \ - libopus-dev \ - libssl-dev \ - libwayland-dev \ - libx11-dev \ - libxcb-shm0-dev \ - libxcb-xfixes0-dev \ - libxcb1-dev \ - libxfixes-dev \ - libxrandr-dev \ - libxtst-dev \ - nvidia-cuda-dev \ - nvidia-cuda-toolkit \ + build-essential=12.9* \ + cmake=3.22.1* \ + libavdevice-dev=7:4.4.* \ + libboost-filesystem-dev=1.74.0* \ + libboost-log-dev=1.74.0* \ + libboost-thread-dev=1.74.0* \ + libcap-dev=1:2.44* \ + libdrm-dev=2.4.110* \ + libevdev-dev=1.12.1* \ + libpulse-dev=1:15.99.1* \ + libopus-dev=1.3.1* \ + libssl-dev=3.0.2* \ + libwayland-dev=1.20.0* \ + libx11-dev=2:1.7.5* \ + libxcb-shm0-dev=1.14* \ + libxcb-xfixes0-dev=1.14* \ + libxcb1-dev=1.14* \ + libxfixes-dev=1:6.0.0* \ + libxrandr-dev=2:1.5.2* \ + libxtst-dev=2:1.2.3* \ + nvidia-cuda-dev=11.5.1* \ + nvidia-cuda-toolkit=11.5.1* \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* From 1d239ed15387d8b679a6da0bc2454d16fb6bfe08 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Thu, 11 Aug 2022 21:29:01 -0400 Subject: [PATCH 3/7] remove legacy docker builds --- scripts/Dockerfile-debian | 40 ------- scripts/Dockerfile-fedora_33 | 32 ------ scripts/Dockerfile-fedora_35 | 36 ------- scripts/Dockerfile-ubuntu_18_04 | 63 ----------- scripts/Dockerfile-ubuntu_20_04 | 46 -------- scripts/Dockerfile-ubuntu_21_04 | 40 ------- scripts/Dockerfile-ubuntu_21_10 | 39 ------- scripts/build-container.sh | 179 -------------------------------- scripts/build-private.sh | 48 --------- scripts/build-sunshine.sh | 132 ----------------------- 10 files changed, 655 deletions(-) delete mode 100644 scripts/Dockerfile-debian delete mode 100644 scripts/Dockerfile-fedora_33 delete mode 100644 scripts/Dockerfile-fedora_35 delete mode 100644 scripts/Dockerfile-ubuntu_18_04 delete mode 100644 scripts/Dockerfile-ubuntu_20_04 delete mode 100644 scripts/Dockerfile-ubuntu_21_04 delete mode 100644 scripts/Dockerfile-ubuntu_21_10 delete mode 100755 scripts/build-container.sh delete mode 100755 scripts/build-private.sh delete mode 100755 scripts/build-sunshine.sh diff --git a/scripts/Dockerfile-debian b/scripts/Dockerfile-debian deleted file mode 100644 index fc77eb8e989..00000000000 --- a/scripts/Dockerfile-debian +++ /dev/null @@ -1,40 +0,0 @@ -FROM debian:bullseye AS sunshine-debian - -# Debian Bullseye end of life is TBD - -ARG DEBIAN_FRONTEND=noninteractive -ARG TZ="Europe/London" - -SHELL ["/bin/bash", "-o", "pipefail", "-c"] -RUN echo deb http://deb.debian.org/debian/ bullseye main contrib non-free | tee /etc/apt/sources.list.d/non-free.list -RUN apt-get update -y && \ - apt-get install -y \ - build-essential \ - cmake \ - git \ - libavdevice-dev \ - libboost-filesystem-dev \ - libboost-log-dev \ - libboost-thread-dev \ - libcap-dev \ - libdrm-dev \ - libevdev-dev \ - libpulse-dev \ - libopus-dev \ - libssl-dev \ - libwayland-dev \ - libx11-dev \ - libxcb-shm0-dev \ - libxcb-xfixes0-dev \ - libxcb1-dev \ - libxfixes-dev \ - libxrandr-dev \ - libxtst-dev \ - nvidia-cuda-dev \ - nvidia-cuda-toolkit \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -# Entrypoint -COPY build-private.sh /root/build.sh -ENTRYPOINT ["/root/build.sh", "-deb"] diff --git a/scripts/Dockerfile-fedora_33 b/scripts/Dockerfile-fedora_33 deleted file mode 100644 index 320c6a6748c..00000000000 --- a/scripts/Dockerfile-fedora_33 +++ /dev/null @@ -1,32 +0,0 @@ -FROM fedora:33 AS sunshine-fedora_33 - -# Fedora 33 end of life is November 2021 -# This file remains for reference only - -SHELL ["/bin/bash", "-o", "pipefail", "-c"] -RUN dnf -y update && \ - dnf -y group install "Development Tools" && \ - dnf -y install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm && \ - dnf -y install \ - boost-devel \ - boost-static.x86_64 \ - cmake \ - ffmpeg-devel \ - libevdev-devel \ - libxcb-devel \ - libX11-devel \ - libXfixes-devel \ - libXrandr-devel \ - libXtst-devel \ - openssl-devel \ - opus-devel \ - pulseaudio-libs-devel \ - libcap-devel \ - libdrm-devel \ - rpm-build \ - && dnf clean all \ - && rm -rf /var/cache/yum - -# Entrypoint -COPY build-private.sh /root/build.sh -ENTRYPOINT ["/root/build.sh", "-rpm"] diff --git a/scripts/Dockerfile-fedora_35 b/scripts/Dockerfile-fedora_35 deleted file mode 100644 index 18f5bf53a56..00000000000 --- a/scripts/Dockerfile-fedora_35 +++ /dev/null @@ -1,36 +0,0 @@ -FROM fedora:35 AS sunshine-fedora_35 - -# Fedora 35 end of life is TBD - -SHELL ["/bin/bash", "-o", "pipefail", "-c"] -RUN dnf -y update && \ - dnf -y group install "Development Tools" && \ - dnf -y install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm && \ - dnf -y install \ - boost-devel \ - boost-static.x86_64 \ - cmake \ - ffmpeg-devel \ - gcc-c++ \ - libevdev-devel \ - libX11-devel \ - libxcb-devel \ - libXcursor-devel \ - libXfixes-devel \ - libXinerama-devel \ - libXi-devel \ - libXrandr-devel \ - libXtst-devel \ - mesa-libGL-devel \ - openssl-devel \ - opus-devel \ - pulseaudio-libs-devel \ - libcap-devel \ - libdrm-devel \ - rpm-build \ - && dnf clean all \ - && rm -rf /var/cache/yum - -# Entrypoint -COPY build-private.sh /root/build.sh -ENTRYPOINT ["/root/build.sh", "-rpm"] diff --git a/scripts/Dockerfile-ubuntu_18_04 b/scripts/Dockerfile-ubuntu_18_04 deleted file mode 100644 index 6ad3e8c02ad..00000000000 --- a/scripts/Dockerfile-ubuntu_18_04 +++ /dev/null @@ -1,63 +0,0 @@ -FROM ubuntu:18.04 AS sunshine-ubuntu_18_04 - -# Ubuntu 18.04 end of life is April 2028 - -ARG DEBIAN_FRONTEND=noninteractive -ARG TZ="Europe/London" - -SHELL ["/bin/bash", "-o", "pipefail", "-c"] -RUN apt-get update -y && \ - apt-get install -y \ - software-properties-common \ - && add-apt-repository ppa:savoury1/graphics && \ - add-apt-repository ppa:savoury1/multimedia && \ - add-apt-repository ppa:savoury1/ffmpeg4 && \ - add-apt-repository ppa:savoury1/boost-defaults-1.71 && \ - add-apt-repository ppa:ubuntu-toolchain-r/test && \ - apt-get update -y && \ - apt-get install -y \ - build-essential \ - cmake \ - gcc-10 \ - git \ - g++-10 \ - libavdevice-dev \ - libboost-filesystem1.71-dev \ - libboost-log1.71-dev \ - libboost-regex1.71-dev \ - libboost-thread1.71-dev \ - libcap-dev \ - libdrm-dev \ - libevdev-dev \ - libpulse-dev \ - libopus-dev \ - libssl-dev \ - libwayland-dev \ - libx11-dev \ - libxcb-shm0-dev \ - libxcb-xfixes0-dev \ - libxcb1-dev \ - libxfixes-dev \ - libxrandr-dev \ - libxtst-dev \ - wget \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -# Update gcc alias -RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 - -# Install CuDA -RUN wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda_11.4.2_470.57.02_linux.run --progress=bar:force:noscroll -q --show-progress -O /root/cuda.run && chmod a+x /root/cuda.run -RUN /root/cuda.run --silent --toolkit --toolkitpath=/usr --no-opengl-libs --no-man-page --no-drm && rm /root/cuda.run - -# Install cmake -ADD https://cmake.org/files/v3.22/cmake-3.22.2-linux-x86_64.sh /cmake-3.22.2-linux-x86_64.sh -RUN mkdir /opt/cmake -RUN sh /cmake-3.22.2-linux-x86_64.sh --prefix=/opt/cmake --skip-license -RUN ln -s /opt/cmake/bin/cmake /usr/local/bin/cmake -RUN cmake --version - -# Entrypoint -COPY build-private.sh /root/build.sh -ENTRYPOINT ["/root/build.sh", "-deb"] diff --git a/scripts/Dockerfile-ubuntu_20_04 b/scripts/Dockerfile-ubuntu_20_04 deleted file mode 100644 index 44e897a7586..00000000000 --- a/scripts/Dockerfile-ubuntu_20_04 +++ /dev/null @@ -1,46 +0,0 @@ -FROM ubuntu:20.04 AS sunshine-ubuntu_20_04 - -# Ubuntu 20.04 end of life is April 2030 - -ARG DEBIAN_FRONTEND=noninteractive -ARG TZ="Europe/London" - -SHELL ["/bin/bash", "-o", "pipefail", "-c"] -RUN apt-get update -y && \ - apt-get install -y \ - build-essential \ - cmake \ - git \ - g++-10 \ - libavdevice-dev \ - libboost-filesystem-dev \ - libboost-log-dev \ - libboost-thread-dev \ - libcap-dev \ - libdrm-dev \ - libevdev-dev \ - libpulse-dev \ - libopus-dev \ - libssl-dev \ - libwayland-dev \ - libx11-dev \ - libxcb-shm0-dev \ - libxcb-xfixes0-dev \ - libxcb1-dev \ - libxfixes-dev \ - libxrandr-dev \ - libxtst-dev \ - wget \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -# Update gcc alias -RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 - -# Install CuDA -RUN wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda_11.4.2_470.57.02_linux.run --progress=bar:force:noscroll -q --show-progress -O /root/cuda.run && chmod a+x /root/cuda.run -RUN /root/cuda.run --silent --toolkit --toolkitpath=/usr --no-opengl-libs --no-man-page --no-drm && rm /root/cuda.run - -# Entrypoint -COPY build-private.sh /root/build.sh -ENTRYPOINT ["/root/build.sh", "-deb"] diff --git a/scripts/Dockerfile-ubuntu_21_04 b/scripts/Dockerfile-ubuntu_21_04 deleted file mode 100644 index 012845a5b69..00000000000 --- a/scripts/Dockerfile-ubuntu_21_04 +++ /dev/null @@ -1,40 +0,0 @@ -FROM ubuntu:21.04 AS sunshine-ubuntu_21_04 - -# Ubuntu 21.04 end of life is January 2022 -# This file remains for reference only - -ARG DEBIAN_FRONTEND=noninteractive -ARG TZ="Europe/London" - -SHELL ["/bin/bash", "-o", "pipefail", "-c"] -RUN apt-get update -y && \ - apt-get install -y \ - build-essential \ - cmake \ - git \ - libavdevice-dev \ - libboost-thread-dev \ - libboost-filesystem-dev \ - libboost-log-dev \ - libcap-dev \ - libdrm-dev \ - libevdev-dev \ - libpulse-dev \ - libopus-dev \ - libssl-dev \ - libwayland-dev \ - libx11-dev \ - libxcb-shm0-dev \ - libxcb-xfixes0-dev \ - libxcb1-dev \ - libxfixes-dev \ - libxrandr-dev \ - libxtst-dev \ - nvidia-cuda-dev \ - nvidia-cuda-toolkit \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -# Entrypoint -COPY build-private.sh /root/build.sh -ENTRYPOINT ["/root/build.sh", "-deb"] diff --git a/scripts/Dockerfile-ubuntu_21_10 b/scripts/Dockerfile-ubuntu_21_10 deleted file mode 100644 index 6be49dbe0cb..00000000000 --- a/scripts/Dockerfile-ubuntu_21_10 +++ /dev/null @@ -1,39 +0,0 @@ -FROM ubuntu:21.10 AS sunshine-ubuntu_21_10 - -# Ubuntu 21.10 end of life is July 2022 - -ARG DEBIAN_FRONTEND=noninteractive -ARG TZ="Europe/London" - -SHELL ["/bin/bash", "-o", "pipefail", "-c"] -RUN apt-get update -y && \ - apt-get install -y \ - build-essential \ - cmake \ - git \ - libavdevice-dev \ - libboost-filesystem-dev \ - libboost-log-dev \ - libboost-thread-dev \ - libcap-dev \ - libdrm-dev \ - libevdev-dev \ - libpulse-dev \ - libopus-dev \ - libssl-dev \ - libwayland-dev \ - libx11-dev \ - libxcb-shm0-dev \ - libxcb-xfixes0-dev \ - libxcb1-dev \ - libxfixes-dev \ - libxrandr-dev \ - libxtst-dev \ - nvidia-cuda-dev \ - nvidia-cuda-toolkit \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -# Entrypoint -COPY build-private.sh /root/build.sh -ENTRYPOINT ["/root/build.sh", "-deb"] diff --git a/scripts/build-container.sh b/scripts/build-container.sh deleted file mode 100755 index 5da4784aef2..00000000000 --- a/scripts/build-container.sh +++ /dev/null @@ -1,179 +0,0 @@ -#!/bin/bash -e -set -e - -usage() { - echo "Usage: $0 [OPTIONS]" - echo " -c: command --> default [build]" - echo " | delete --> Delete the container, Dockerfile isn't mandatory" - echo " | build --> Build the container, Dockerfile is mandatory" - echo " | compile --> Builds the container, then compiles it. Dockerfile is mandatory" - echo "" - echo " -s: path: The path to the source for compilation" - echo " -n: name: Docker container name --> default [sunshine]" - echo " --> all: Build/Compile/Delete all available docker containers" - echo " -f: Dockerfile: The name of the docker file" -} - -# Attempt to turn relative paths into absolute paths -absolute_path() { - RELATIVE_PATH=$1 - if which realpath >/dev/null 2>/dev/null - then - RELATIVE_PATH=$(realpath $RELATIVE_PATH) - else - echo "Warning: realpath is not installed on your system, ensure [$1] is absolute" - fi - - RETURN=$RELATIVE_PATH -} - -CONTAINER_NAME=sunshine -COMMAND=BUILD - -build_container() { - CONTAINER_NAME=$1 - DOCKER_FILE=$2 - - if [ ! -f "$DOCKER_FILE" ] - then - echo "Error: $DOCKER_FILE doesn't exist" - exit 7 - fi - - echo "docker build . -t $CONTAINER_NAME -f $DOCKER_FILE" - docker build . -t "$CONTAINER_NAME" -f "$DOCKER_FILE" -} - -delete() { - CONTAINER_NAME_UPPER=$(echo "$CONTAINER_NAME" | tr '[:lower:]' '[:upper:]') - if [ "$CONTAINER_NAME_UPPER" = "ALL" ] - then - shopt -s nullglob - for file in $(find . -maxdepth 1 -iname "Dockerfile-*" -type f) - do - CURRENT_CONTAINER="sunshine-$(echo $file | cut -c 14-)" - - if docker inspect "$CURRENT_CONTAINER" > /dev/null 2> /dev/null - then - echo "docker rmi $CURRENT_CONTAINER" - docker rmi "$CURRENT_CONTAINER" - fi - done - shopt -u nullglob #revert nullglob back to it's normal default state - else - if docker inspect "$CONTAINER_NAME" > /dev/null 2> /dev/null - then - echo "docker rmi $CONTAINER_NAME" - docker rmi $CONTAINER_NAME - fi - fi -} - -build() { - CONTAINER_NAME_UPPER=$(echo "$CONTAINER_NAME" | tr '[:lower:]' '[:upper:]') - if [ "$CONTAINER_NAME_UPPER" = "ALL" ] - then - shopt -s nullglob - for file in $(find . -maxdepth 1 -iname "Dockerfile-*" -type f) - do - CURRENT_CONTAINER="sunshine-$(echo $file | cut -c 14-)" - build_container "$CURRENT_CONTAINER" "$file" - done - shopt -u nullglob #revert nullglob back to it's normal default state - else - if [[ -z "$DOCKER_FILE" ]] - then - echo "Error: if container name isn't equal to 'all', you need to specify the Dockerfile" - exit 6 - fi - - build_container "$CONTAINER_NAME" "$DOCKER_FILE" - fi -} - -abort() { - echo "$1" - exit 10 -} - -compile() { - CONTAINER_NAME_UPPER=$(echo "$CONTAINER_NAME" | tr '[:lower:]' '[:upper:]') - if [ "$CONTAINER_NAME_UPPER" = "ALL" ] - then - shopt -s nullglob - - # If any docker container doesn't exist, we cannot compile all of them - for file in $(find . -maxdepth 1 -iname "Dockerfile-*" -type f) - do - CURRENT_CONTAINER="sunshine-$(echo $file | cut -c 14-)" - - # If container doesn't exist --> abort. - docker inspect "$CURRENT_CONTAINER" > /dev/null 2> /dev/null || abort "Error: container image [$CURRENT_CONTAINER] doesn't exist" - done - - for file in $(find . -maxdepth 1 -iname "Dockerfile-*" -type f) - do - CURRENT_CONTAINER="sunshine-$(echo $file | cut -c 14-)" - - echo "$PWD/build-sunshine.sh -p -n $CURRENT_CONTAINER $SUNSHINE_SOURCES" - "$PWD/build-sunshine.sh" -p -n "$CURRENT_CONTAINER" $SUNSHINE_SOURCES - done - shopt -u nullglob #revert nullglob back to it's normal default state - else - # If container exists - if docker inspect "$CONTAINER_NAME" > /dev/null 2> /dev/null - then - echo "$PWD/build-sunshine.sh -p -n $CONTAINER_NAME $SUNSHINE_SOURCES" - "$PWD/build-sunshine.sh" -p -n "$CONTAINER_NAME" $SUNSHINE_SOURCES - else - echo "Error: container image [$CONTAINER_NAME] doesn't exist" - exit 9 - fi - fi -} - -while getopts ":c:hn:f:s:" arg; do - case ${arg} in - s) - SUNSHINE_SOURCES="-s $OPTARG" - ;; - c) - COMMAND=$(echo $OPTARG | tr '[:lower:]' '[:upper:]') - ;; - n) - echo "Container name: $OPTARG" - CONTAINER_NAME="$OPTARG" - ;; - f) - echo "Using Dockerfile [$OPTARG]" - DOCKER_FILE="$OPTARG" - ;; - h) - usage - exit 0 - ;; - esac -done - -echo "$0 set to $(echo $COMMAND | tr '[:upper:]' '[:lower:]')" - -if [ "$COMMAND" = "BUILD" ] -then - echo "Start building..." - delete - build - echo "Done." -elif [ "$COMMAND" = "COMPILE" ] -then - echo "Start compiling..." - compile - echo "Done." -elif [ "$COMMAND" = "DELETE" ] -then - echo "Start deleting..." - delete - echo "Done." -else - echo "Unknown command [$(echo $COMMAND | tr '[:upper:]' '[:lower:]')]" - exit 4 -fi diff --git a/scripts/build-private.sh b/scripts/build-private.sh deleted file mode 100755 index 80c7d6bcb49..00000000000 --- a/scripts/build-private.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash -e -set -e - -CMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE:-Release}" -SUNSHINE_EXECUTABLE_PATH="${SUNSHINE_EXECUTABLE_PATH:-/usr/bin/sunshine}" -SUNSHINE_ASSETS_DIR="${SUNSHINE_ASSETS_DIR:-/etc/sunshine}" - - -SUNSHINE_ROOT="${SUNSHINE_ROOT:-/root/sunshine}" -SUNSHINE_TAG="${SUNSHINE_TAG:-master}" -SUNSHINE_GIT_URL="${SUNSHINE_GIT_URL:-https://github.com/lizardbyte/sunshine.git}" - - -SUNSHINE_ENABLE_WAYLAND=${SUNSHINE_ENABLE_WAYLAND:-ON} -SUNSHINE_ENABLE_X11=${SUNSHINE_ENABLE_X11:-ON} -SUNSHINE_ENABLE_DRM=${SUNSHINE_ENABLE_DRM:-ON} -SUNSHINE_ENABLE_CUDA=${SUNSHINE_ENABLE_CUDA:-ON} - -# For debugging, it would be usefull to have the sources on the host. -if [[ ! -d "$SUNSHINE_ROOT" ]] -then - git clone --depth 1 --branch "$SUNSHINE_TAG" "$SUNSHINE_GIT_URL" --recurse-submodules "$SUNSHINE_ROOT" -fi - -if [[ ! -d /root/sunshine-build ]] -then - mkdir -p /root/sunshine-build -fi -cd /root/sunshine-build - -cmake "-DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE" "-DSUNSHINE_EXECUTABLE_PATH=$SUNSHINE_EXECUTABLE_PATH" "-DSUNSHINE_ASSETS_DIR=$SUNSHINE_ASSETS_DIR" "-DSUNSHINE_ENABLE_WAYLAND=$SUNSHINE_ENABLE_WAYLAND" "-DSUNSHINE_ENABLE_X11=$SUNSHINE_ENABLE_X11" "-DSUNSHINE_ENABLE_DRM=$SUNSHINE_ENABLE_DRM" "-DSUNSHINE_ENABLE_CUDA=$SUNSHINE_ENABLE_CUDA" "$SUNSHINE_ROOT" - -make -j ${nproc} - -# Get preferred package format -if [ "$1" == "-rpm" ] -then - echo "Packaging in .rpm format." - ./gen-rpm -d -elif [ "$1" == "-deb" ] -then - echo "Packaging in .deb format." - ./gen-deb -else - echo "Preferred packaging not specified." - echo "Use -deb or -rpm to specify preferred package format." - exit 1 -fi diff --git a/scripts/build-sunshine.sh b/scripts/build-sunshine.sh deleted file mode 100755 index 4284375290b..00000000000 --- a/scripts/build-sunshine.sh +++ /dev/null @@ -1,132 +0,0 @@ -#!/bin/bash -e -set -e - -usage() { - echo "Usage: $0" - echo " -d: Generate a debug build" - echo " -p: Generate a linux package" - echo " -e: Extension of package... i.e. 'deb', 'rpm' --> default [deb]" - echo " -u: The input device is not a TTY" - echo " -n name: Docker container name --> default [sunshine]" - echo " -s path/to/sources/sunshine: Use local sources instead of a git repository" - echo " -c path/to/cmake/binary/dir: Store cmake output on host OS" -} - -# Attempt to turn relative paths into absolute paths -absolute_path() { - RELATIVE_PATH=$1 - if which realpath >/dev/null 2>/dev/null - then - RELATIVE_PATH=$(realpath $RELATIVE_PATH) - else - echo "Warning: realpath is not installed on your system, ensure [$1] is absolute" - fi - - RETURN=$RELATIVE_PATH -} - -CMAKE_BUILD_TYPE="-e CMAKE_BUILD_TYPE=Release" -SUNSHINE_PACKAGE_BUILD=OFF -SUNSHINE_PACKAGE_EXTENSION=deb -SUNSHINE_GIT_URL=https://github.com/lizardbyte/sunshine.git -CONTAINER_NAME=sunshine - -# Docker will fail if ctrl+c is passed through and the input is not a tty -DOCKER_INTERACTIVE=-ti - -while getopts ":dpuhc:e:s:n:" arg; do - case ${arg} in - u) - echo "Input device is not a TTY" - USERNAME="$USER" - unset DOCKER_INTERACTIVE - ;; - d) - echo "Creating debug build" - CMAKE_BUILD_TYPE="-e CMAKE_BUILD_TYPE=Debug" - ;; - p) - echo "Creating package build" - SUNSHINE_PACKAGE_BUILD=ON - SUNSHINE_ASSETS_DIR="-e SUNSHINE_ASSETS_DIR=/etc/sunshine" - SUNSHINE_EXECUTABLE_PATH="-e SUNSHINE_EXECUTABLE_PATH=/usr/bin/sunshine" - ;; - e) - echo "Defining package extension: $OPTARG" - if [ "$OPTARG" == "deb" ] - then - SUNSHINE_PACKAGE_EXTENSION=$OPTARG - echo "Package extension: deb" - elif [ "$OPTARG" == "rpm" ] - then - SUNSHINE_PACKAGE_EXTENSION=$OPTARG - echo "Package extension: rpm" - else - echo "Package extension not supported: $OPTARG" - echo "Falling back to default package extension: $SUNSHINE_PACKAGE_EXTENSION" - fi - ;; - s) - absolute_path "$OPTARG" - OPTARG="$RETURN" - echo "Using sources from $OPTARG" - SUNSHINE_ROOT="-v $OPTARG:/root/sunshine" - ;; - c) - [ "$USERNAME" == "" ] && USERNAME=$(logname) - - absolute_path "$OPTARG" - OPTARG="$RETURN" - - echo "Using $OPTARG as cmake binary dir" - if [[ ! -d $OPTARG ]] - then - echo "cmake binary dir doesn't exist, a new one will be created." - mkdir -p "$OPTARG" - [ "$USERNAME" == "$USER"] || chown $USERNAME:$USERNAME "$OPTARG" - fi - - CMAKE_ROOT="-v $OPTARG:/root/sunshine-build" - ;; - n) - echo "Container name: $OPTARG" - CONTAINER_NAME=$OPTARG - ;; - h) - usage - exit 0 - ;; - esac -done - -[ "$USERNAME" = "" ] && USERNAME=$(logname) - -BUILD_DIR="$PWD/$CONTAINER_NAME-build" -[ "$SUNSHINE_ASSETS_DIR" = "" ] && SUNSHINE_ASSETS_DIR="-e SUNSHINE_ASSETS_DIR=$BUILD_DIR/assets" -[ "$SUNSHINE_EXECUTABLE_PATH" = "" ] && SUNSHINE_EXECUTABLE_PATH="-e SUNSHINE_EXECUTABLE_PATH=$BUILD_DIR/sunshine" - -echo "docker run $DOCKER_INTERACTIVE --privileged $SUNSHINE_ROOT $CMAKE_ROOT $SUNSHINE_ASSETS_DIR $SUNSHINE_EXECUTABLE_PATH $CMAKE_BUILD_TYPE --name $CONTAINER_NAME $CONTAINER_NAME" -docker run $DOCKER_INTERACTIVE --privileged $SUNSHINE_ROOT $CMAKE_ROOT $SUNSHINE_ASSETS_DIR $SUNSHINE_EXECUTABLE_PATH $CMAKE_BUILD_TYPE --name $CONTAINER_NAME $CONTAINER_NAME - -exit_code=$? - -if [ $exit_code -eq 0 ] -then - mkdir -p $BUILD_DIR - case $SUNSHINE_PACKAGE_BUILD in - ON) - echo "Downloading package to: $BUILD_DIR/$CONTAINER_NAME.$SUNSHINE_PACKAGE_EXTENSION" - docker cp $CONTAINER_NAME:/root/sunshine-build/package-$SUNSHINE_PACKAGE_EXTENSION/sunshine.$SUNSHINE_PACKAGE_EXTENSION "$BUILD_DIR/$CONTAINER_NAME.$SUNSHINE_PACKAGE_EXTENSION" - ;; - *) - echo "Downloading binary and assets to: $BUILD_DIR" - docker cp $CONTAINER_NAME:/root/sunshine/assets "$BUILD_DIR" - docker cp $CONTAINER_NAME:/root/sunshine-build/sunshine "$BUILD_DIR" - ;; - esac - echo "chown --recursive $USERNAME:$USERNAME $BUILD_DIR" - chown --recursive $USERNAME:$USERNAME "$BUILD_DIR" -fi - -echo "Removing docker container $CONTAINER_NAME" -docker rm $CONTAINER_NAME From 3c7bec38ed0eab41dc60bffc5d988040d09cfb25 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Thu, 11 Aug 2022 21:29:19 -0400 Subject: [PATCH 4/7] update docker documentation --- docs/source/about/advanced_usage.rst | 2 +- docs/source/about/docker.rst | 2 - docs/source/about/installation.rst | 5 +- docs/source/building/linux.rst | 77 ++-------------------------- 4 files changed, 7 insertions(+), 79 deletions(-) diff --git a/docs/source/about/advanced_usage.rst b/docs/source/about/advanced_usage.rst index 0d65175e4c2..e21cf68eaf1 100644 --- a/docs/source/about/advanced_usage.rst +++ b/docs/source/about/advanced_usage.rst @@ -20,7 +20,7 @@ location by modifying the configuration file. ========= =========== Value Description ========= =========== - Docker /config/ + Docker /etc/sunshine/config/ Linux-aur /usr/share/sunshine/config/ Linux-deb /usr/local/sunshine/config/ Linux-rpm /usr/local/sunshine/config/ diff --git a/docs/source/about/docker.rst b/docs/source/about/docker.rst index 8a597e261fa..77e4e20833d 100644 --- a/docs/source/about/docker.rst +++ b/docs/source/about/docker.rst @@ -1,5 +1,3 @@ :github_url: https://github.com/LizardByte/Sunshine/tree/nightly/docs/DOCKER_README.md -.. Todo:: This is a planned feature. Currently no Dockerfile or image exists for Sunshine. - .. mdinclude:: ../../../DOCKER_README.md diff --git a/docs/source/about/installation.rst b/docs/source/about/installation.rst index f1687b3d1c0..8fcde3f9461 100644 --- a/docs/source/about/installation.rst +++ b/docs/source/about/installation.rst @@ -14,8 +14,9 @@ Binaries can be found in the `latest release`_. Docker ------ -.. Todo:: Docker images of Sunshine are planned to be included in the future. - They will be available on `Dockerhub.io`_ and `ghcr.io`_. +Docker images are available on `Dockerhub.io`_ and `ghcr.io`_. + +See :ref:`Docker ` for additional information. Linux ----- diff --git a/docs/source/building/linux.rst b/docs/source/building/linux.rst index c841ad61cfb..b2b4bfc7323 100644 --- a/docs/source/building/linux.rst +++ b/docs/source/building/linux.rst @@ -5,8 +5,6 @@ Linux Requirements ------------ -.. Danger:: Installing these dependencies may break your distribution. It is recommended to build in a virtual machine - or to use the `Dockerfile builds`_ located in the `./scripts` directory. Debian Bullseye ^^^^^^^^^^^^^^^ @@ -18,7 +16,6 @@ Install Requirements sudo apt update && sudo apt install \ build-essential \ cmake \ - git \ libavdevice-dev \ libboost-filesystem-dev \ libboost-log-dev \ @@ -97,7 +94,6 @@ Install Requirements build-essential \ cmake \ gcc-10 \ - git \ g++-10 \ libavdevice-dev \ libboost-filesystem1.71-dev \ @@ -150,7 +146,6 @@ Install Requirements sudo apt update && sudo apt install \ build-essential \ cmake \ - git \ g++-10 \ libavdevice-dev \ libboost-filesystem-dev \ @@ -183,9 +178,9 @@ Install CuDA wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda_11.4.2_470.57.02_linux.run --progress=bar:force:noscroll -q --show-progress -O ./cuda.run && chmod a+x ./cuda.run ./cuda.run --silent --toolkit --toolkitpath=/usr --no-opengl-libs --no-man-page --no-drm && rm ./cuda.run -Ubuntu 21.10 +Ubuntu 22.04 ^^^^^^^^^^^^ -End of Life: July 2022 +End of Life: April 2027 Install Requirements .. code-block:: bash @@ -193,7 +188,6 @@ Install Requirements sudo apt update && sudo apt install \ build-essential \ cmake \ - git \ libavdevice-dev \ libboost-filesystem-dev \ libboost-log-dev \ @@ -215,12 +209,6 @@ Install Requirements nvidia-cuda-dev \ # Cuda, NvFBC nvidia-cuda-toolkit \ # Cuda, NvFBC -Ubuntu 22.04 -^^^^^^^^^^^^ -End of Life: April 2027 - -.. Todo:: Create Ubuntu 22.04 Dockerfile and complete this documentation. - Build ----- .. Attention:: Ensure you are in the build directory created during the clone step earlier before continuing. @@ -230,7 +218,7 @@ Debian based OSes cmake -DCMAKE_C_COMPILER=gcc-10 -DCMAKE_CXX_COMPILER=g++-10 .. -Red Hat based Oses +Red Hat based OSes .. code-block:: bash cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ .. @@ -241,62 +229,3 @@ Finally make -j ${nproc} cpack -G DEB # optionally, create a deb package cpack -G RPM # optionally, create a rpm package - -Dockerfile Builds ------------------ -You may wish to simply build sunshine from source, without bloating your OS with development files. -There are scripts located in the ``./scripts`` directory that will create docker images that have the necessary -packages. As a result, removing the development files after you're done is a single command away. -These scripts use docker under the hood, as such, they can only be used to compile the Linux version - -.. Todo:: Publish the Dockerfiles to Dockerhub and ghcr. - -Requirements - Install `Docker `_ - -Instructions - #. :ref:`Clone `. Sunshine. - #. Select the desired Dockerfile from the ``./scripts`` directory. - - Available Files: - .. code-block:: text - - Dockerfile-debian - Dockerfile-fedora_33 # end of life - Dockerfile-fedora_35 - Dockerfile-ubuntu_18_04 - Dockerfile-ubuntu_20_04 - Dockerfile-ubuntu_21_04 # end of life - Dockerfile-ubuntu_21_10 - - #. Execute - - .. code-block:: bash - - cd scripts # move to the scripts directory - ./build-container.sh -f Dockerfile- # create the container (replace the "") - ./build-sunshine.sh -p -s .. # compile and build sunshine - - #. Updating - - .. code-block:: bash - - git pull # pull the latest changes from github - ./build-sunshine.sh -p -s .. # compile and build sunshine - - #. Optionally, delete the container - .. code-block:: bash - - ./build-container.sh -c delete - - #. Install the resulting package - - Debian - .. code-block:: bash - - sudo apt install -f sunshine-build/sunshine.deb - - Red Hat - .. code-block:: bash - - sudo dnf install sunshine-build/sunshine.rpm From 6c0fc482c6b0c0f1253ab5b19d84d213177740d1 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Sun, 16 Oct 2022 11:29:31 -0400 Subject: [PATCH 5/7] update docker build --- .dockerignore | 16 ++++++ .github/workflows/ci-docker.yml | 32 +++++++---- DOCKER_README.md | 84 +++++++++------------------- Dockerfile | 12 ++-- docs/source/about/advanced_usage.rst | 2 +- 5 files changed, 70 insertions(+), 76 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000000..fb14701dd6a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,16 @@ +# ignore git files +.git* + +# ignore hidden files +.* + +# ignore repo directories and files +docs/ +packaging/ +scripts/ +tools/ +crowdin.yml + +# ignore dev directories +build/ +venv/ diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index ed36038d1ed..64a46275f30 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -31,7 +31,7 @@ jobs: FOUND=false fi - echo "::set-output name=dockerfile::${FOUND}" + echo "dockerfile=${FOUND}" >> $GITHUB_OUTPUT outputs: dockerfile: ${{ steps.check.outputs.dockerfile }} @@ -42,12 +42,23 @@ jobs: if: ${{ needs.check_dockerfile.outputs.dockerfile == 'true' }} runs-on: ubuntu-latest steps: - - name: Lint Dockerfile + - name: Checkout uses: actions/checkout@v3 - - uses: hadolint/hadolint-action@v2.1.0 + - name: Hadolint + id: hadolint + uses: hadolint/hadolint-action@v2.1.0 with: dockerfile: ./Dockerfile + ignore: DL3008,DL3013,DL3016,DL3018,DL3028,DL3059 + output-file: ./hadolint.log + verbose: true + + - name: Log + if: failure() + run: | + Hadolint outcome: ${{ steps.hadolint.outcome }} >> $GITHUB_STEP_SUMMARY + cat "./hadolint.log" >> $GITHUB_STEP_SUMMARY check_changelog: name: Check Changelog @@ -128,12 +139,12 @@ jobs: # read the platforms from `.docker_platforms` PLATFORMS=$(<.docker_platforms) - echo ::set-output name=branch::${BRANCH} - echo ::set-output name=build_date::$(date -u +'%Y-%m-%dT%H:%M:%SZ') - echo ::set-output name=commit::${COMMIT} - echo ::set-output name=platforms::${PLATFORMS} - echo ::set-output name=push::${PUSH} - echo ::set-output name=tags::${TAGS} + echo "branch=${BRANCH}" >> $GITHUB_OUTPUT + echo "build_date=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT + echo "commit=${COMMIT}" >> $GITHUB_OUTPUT + echo "platforms=${PLATFORMS}" >> $GITHUB_OUTPUT + echo "push=${PUSH}" >> $GITHUB_OUTPUT + echo "tags=${TAGS}" >> $GITHUB_OUTPUT - name: Set Up QEMU uses: docker/setup-qemu-action@v2 @@ -174,8 +185,9 @@ jobs: platforms: ${{ steps.prepare.outputs.platforms }} build-args: | BRANCH=${{ steps.prepare.outputs.branch }} - COMMIT=${{ steps.prepare.outputs.commit }} BUILD_DATE=${{ steps.prepare.outputs.build_date }} + BUILD_VERSION=${{ needs.check_changelog.outputs.next_version }} + COMMIT=${{ steps.prepare.outputs.commit }} tags: ${{ steps.prepare.outputs.tags }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache diff --git a/DOCKER_README.md b/DOCKER_README.md index 5ca999abed8..cac02a20ec6 100644 --- a/DOCKER_README.md +++ b/DOCKER_README.md @@ -1,73 +1,59 @@ # Docker -## Using docker run +## Build your own containers +This image provides a method for you to easily use the latest Sunshine release in your own docker projects. It is not +intended to use as a standalone container at this point. + +```dockerfile +FROM lizardbyte/sunshine + +# install Wayland and Steam + +ENTRYPOINT start-wayland && start-steam && start-sunshine +``` + +## Where used +This is a list of docker projects using Sunshine. Something missing? Let us know about it! + +- [Games on Whales](https://games-on-whales.github.io) + +## Port and Volume mappings +Examples are below of the required mappings. The configuration file will be saved to `/config` in the container. + +### Using docker run Create and run the container (substitute your ``): ```bash docker run -d \ - --name=sunshine \ + --name= \ --restart=unless-stopped -v :/config \ - -e PUID= \ - -e PGID= \ - -e TZ= \ -p 47984-47990:47984-47990/tcp \ -p 48010:48010 \ -p 47998-48000:47998-48000/udp \ - lizardbyte/sunshine -``` - -To update the container it must be removed and recreated: - -```bash -# Stop the container -docker stop sunshine -# Remove the container -docker rm sunshine -# Pull the latest update -docker pull lizardbyte/sunshine -# Run the container with the same parameters as before -docker run -d ... + ``` -## Using docker-compose +### Using docker-compose Create a `docker-compose.yml` file with the following contents (substitute your ``): ```yaml version: '3' services: - sunshine: - image: lizardbyte/sunshine + : + image: container_name: sunshine restart: unless-stopped volumes: - :/config - environment: - - PUID= - - PGID= - - TZ= ports: - "47984-47990:47984-47990/tcp" - "48010:48010" - "47998-48000:47998-48000/udp" ``` -Create and start the container (run the command from the same folder as your `docker-compose.yml` file): - -```bash -docker-compose up -d -``` - -To update the container: -```bash -# Pull the latest update -docker-compose pull -# Update and restart the container -docker-compose up -d -``` - -## Parameters +### Parameters You must substitute the `` with your own settings. Parameters are split into two halves separated by a colon. The left side represents the host and the right side the @@ -83,19 +69,3 @@ port `47990` (e.g. `http://:47990`). The internal port must be `47990`, |-----------------------------|--------------------------------------------------------------------------------------|--------------------|----------| | `-p :47990` | Web UI Port | `47990` | True | | `-v :/config` | Volume mapping | `/home/sunshine` | True | -| `-e PUID=` | User ID | `1001` | False | -| `-e PGID=` | Group ID | `1001` | False | -| `-e TZ=` | Lookup TZ value [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) | `America/New_York` | True | - -### User / Group Identifiers: - -When using data volumes (-v flags) permissions issues can arise between the host OS and the container. To avoid this -issue you can specify the user PUID and group PGID. Ensure the data volume directory on the host is owned by the same -user you specify. - -In this instance `PUID=1001` and `PGID=1001`. To find yours use id user as below: - -```bash -$ id dockeruser -uid=1001(dockeruser) gid=1001(dockergroup) groups=1001(dockergroup) -``` diff --git a/Dockerfile b/Dockerfile index 58e3e54075d..889959dcf9b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,6 @@ FROM ubuntu:22.04 AS sunshine-base ARG DEBIAN_FRONTEND=noninteractive -ARG TZ="America/New_York" FROM sunshine-base as sunshine-build @@ -34,19 +33,16 @@ RUN apt-get update -y \ && rm -rf /var/lib/apt/lists/* # copy repository -RUN mkdir /root/sunshine-build WORKDIR /root/sunshine-build/ COPY . . # setup build directory -RUN mkdir /root/sunshine-build/build WORKDIR /root/sunshine-build/build # cmake and cpack RUN cmake -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=/etc \ - -DSUNSHINE_ASSETS_DIR=sunshine/assets \ - -DSUNSHINE_CONFIG_DIR=sunshine/config \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DSUNSHINE_ASSETS_DIR=share/sunshine \ -DSUNSHINE_EXECUTABLE_PATH=/usr/bin/sunshine \ -DSUNSHINE_ENABLE_WAYLAND=ON \ -DSUNSHINE_ENABLE_X11=ON \ @@ -63,7 +59,7 @@ COPY --from=sunshine-build /root/sunshine-build/build/cpack_artifacts/Sunshine.d # install sunshine RUN apt-get update -y \ - && apt-get install -y --no-install-recommends -f /sunshine.deb \ + && apt-get install -y --no-install-recommends /sunshine.deb \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* @@ -76,4 +72,4 @@ EXPOSE 47998-48000/udp RUN mkdir /config # entrypoint -ENTRYPOINT ["/usr/bin/sunshine", "/config/sunshine.conf"] +ENTRYPOINT ["/usr/bin/sunshine", "file_apps=/config/apps.json", "file_state=/config/sunshine_state.json", "credentials_file=/config/sunshine_state.json", "/config/sunshine.conf"] diff --git a/docs/source/about/advanced_usage.rst b/docs/source/about/advanced_usage.rst index 2f5fc854362..b86138505b4 100644 --- a/docs/source/about/advanced_usage.rst +++ b/docs/source/about/advanced_usage.rst @@ -20,7 +20,7 @@ location by modifying the configuration file. ========= =========== Value Description ========= =========== - Docker ~/.config/sunshine/ + Docker /config/ Linux ~/.config/sunshine/ macOS ~/.config/sunshine/ Windows ./config/ From 7c25e88de656cfb97f6c8a4e8abe2c0bda3ecd99 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Wed, 26 Oct 2022 22:35:17 -0400 Subject: [PATCH 6/7] Update Dockerfile - add user setup - simplify `ENTRYPOINT` by creating symbolic link to user's config directory Co-Authored-By: ABeltramo --- DOCKER_README.md | 33 ++++++++++++++++++++++++++++----- Dockerfile | 27 ++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/DOCKER_README.md b/DOCKER_README.md index cac02a20ec6..c33bb253dec 100644 --- a/DOCKER_README.md +++ b/DOCKER_README.md @@ -27,6 +27,9 @@ Create and run the container (substitute your ``): docker run -d \ --name= \ --restart=unless-stopped + -e PUID= \ + -e PGID= \ + -e TZ= \ -v :/config \ -p 47984-47990:47984-47990/tcp \ -p 48010:48010 \ @@ -35,7 +38,6 @@ docker run -d \ ``` ### Using docker-compose - Create a `docker-compose.yml` file with the following contents (substitute your ``): ```yaml @@ -47,6 +49,10 @@ services: restart: unless-stopped volumes: - :/config + environment: + - PUID= + - PGID= + - TZ= ports: - "47984-47990:47984-47990/tcp" - "48010:48010" @@ -65,7 +71,24 @@ port `47990` (e.g. `http://:47990`). The internal port must be `47990`, (e.g. `-p 8080:47990`). All the ports listed in the `docker run` and `docker-compose` examples are required. -| Parameter | Function | Example Value | Required | -|-----------------------------|--------------------------------------------------------------------------------------|--------------------|----------| -| `-p :47990` | Web UI Port | `47990` | True | -| `-v :/config` | Volume mapping | `/home/sunshine` | True | +| Parameter | Function | Example Value | Required | +|-----------------------------|---------------------------|--------------------|----------| +| `-p :47990` | Web UI Port | `47990` | True | +| `-v :/config` | Volume mapping | `/home/sunshine` | True | +| `-e PUID=` | User ID | `1001` | False | +| `-e PGID=` | Group ID | `1001` | False | +| `-e TZ=` | Lookup TZ value [here][1] | `America/New_York` | False | + +[1]: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + +#### User / Group Identifiers: +When using data volumes (-v flags) permissions issues can arise between the host OS and the container. To avoid this +issue you can specify the user PUID and group PGID. Ensure the data volume directory on the host is owned by the same +user you specify. + +In this instance `PUID=1001` and `PGID=1001`. To find yours use id user as below: + +```bash +$ id dockeruser +uid=1001(dockeruser) gid=1001(dockergroup) groups=1001(dockergroup) +``` diff --git a/Dockerfile b/Dockerfile index 889959dcf9b..21fc79ab969 100644 --- a/Dockerfile +++ b/Dockerfile @@ -59,9 +59,25 @@ COPY --from=sunshine-build /root/sunshine-build/build/cpack_artifacts/Sunshine.d # install sunshine RUN apt-get update -y \ - && apt-get install -y --no-install-recommends /sunshine.deb \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* + && apt-get install -y --no-install-recommends /sunshine.deb \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# setup user +ARG PGID=1000 +ENV PGID=${PGID} +ARG PUID=1000 +ENV PUID=${PUID} +ENV TZ="UTC" +ARG UNAME=lizard +ENV UNAME=${UNAME} + +ENV HOME=/home/$UNAME + +RUN groupadd -f -g "${PGID}" "${UNAME}" && \ + useradd -mk "$(mktemp -d)" -u "${PUID}" -g "${PGID}" "${UNAME}" + +USER ${UNAME} # network setup EXPOSE 47984-47990/tcp @@ -69,7 +85,8 @@ EXPOSE 48010 EXPOSE 47998-48000/udp # setup config directory -RUN mkdir /config +RUN mkdir -p ${HOME}/.config/sunshine && \ + ln -s ${HOME}/config /config # entrypoint -ENTRYPOINT ["/usr/bin/sunshine", "file_apps=/config/apps.json", "file_state=/config/sunshine_state.json", "credentials_file=/config/sunshine_state.json", "/config/sunshine.conf"] +ENTRYPOINT ["/usr/bin/sunshine"] From d32749572c8df0dbefe3364d0b046793d2f9d045 Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Wed, 26 Oct 2022 22:38:30 -0400 Subject: [PATCH 7/7] Update Docker user --- .github/workflows/ci-docker.yml | 2 +- DOCKER_README.md | 8 +++++--- Dockerfile | 20 ++++++++++---------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 64a46275f30..962bb74cb81 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -57,7 +57,7 @@ jobs: - name: Log if: failure() run: | - Hadolint outcome: ${{ steps.hadolint.outcome }} >> $GITHUB_STEP_SUMMARY + echo "Hadolint outcome: ${{ steps.hadolint.outcome }}" >> $GITHUB_STEP_SUMMARY cat "./hadolint.log" >> $GITHUB_STEP_SUMMARY check_changelog: diff --git a/DOCKER_README.md b/DOCKER_README.md index c33bb253dec..87dbc67284d 100644 --- a/DOCKER_README.md +++ b/DOCKER_README.md @@ -2,14 +2,14 @@ ## Build your own containers This image provides a method for you to easily use the latest Sunshine release in your own docker projects. It is not -intended to use as a standalone container at this point. +intended to use as a standalone container at this point, and should be considered experimental. ```dockerfile FROM lizardbyte/sunshine -# install Wayland and Steam +# install Steam, Wayland, etc. -ENTRYPOINT start-wayland && start-steam && start-sunshine +ENTRYPOINT steam && sunshine ``` ## Where used @@ -92,3 +92,5 @@ In this instance `PUID=1001` and `PGID=1001`. To find yours use id user as below $ id dockeruser uid=1001(dockeruser) gid=1001(dockergroup) groups=1001(dockergroup) ``` + +If you want to change the PUID or PGID after the image has been built, it will require rebuilding the image. diff --git a/Dockerfile b/Dockerfile index 21fc79ab969..b493b0d4621 100644 --- a/Dockerfile +++ b/Dockerfile @@ -63,6 +63,11 @@ RUN apt-get update -y \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* +# network setup +EXPOSE 47984-47990/tcp +EXPOSE 48010 +EXPOSE 47998-48000/udp + # setup user ARG PGID=1000 ENV PGID=${PGID} @@ -75,18 +80,13 @@ ENV UNAME=${UNAME} ENV HOME=/home/$UNAME RUN groupadd -f -g "${PGID}" "${UNAME}" && \ - useradd -mk "$(mktemp -d)" -u "${PUID}" -g "${PGID}" "${UNAME}" + useradd -lm -d ${HOME} -s /bin/bash -g "${PGID}" -G input -u "${PUID}" "${UNAME}" && \ + mkdir -p ${HOME}/.config/sunshine && \ + ln -s ${HOME}/.config/sunshine /config && \ + chown -R ${UNAME} ${HOME} USER ${UNAME} - -# network setup -EXPOSE 47984-47990/tcp -EXPOSE 48010 -EXPOSE 47998-48000/udp - -# setup config directory -RUN mkdir -p ${HOME}/.config/sunshine && \ - ln -s ${HOME}/config /config +WORKDIR ${HOME} # entrypoint ENTRYPOINT ["/usr/bin/sunshine"]