Add foundation for docker (#510)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 8 Mar 2023 22:55:30 +0000 (23:55 +0100)
committerGitHub <noreply@github.com>
Wed, 8 Mar 2023 22:55:30 +0000 (23:55 +0100)
* docker base

* add workflow for docker publish

* add compose

.github/workflows/docker-build.yml [new file with mode: 0644]
Dockerfile [new file with mode: 0644]
compose.yml [new file with mode: 0644]
music_assistant/server/helpers/util.py

diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml
new file mode 100644 (file)
index 0000000..68d68f6
--- /dev/null
@@ -0,0 +1,75 @@
+name: Build multiarch Docker image
+
+on:
+  release:
+    types: [published, prereleased]
+  workflow_dispatch:
+    inputs:
+      logLevel:
+        description: 'Log level'
+        required: true
+        default: 'warning'
+      tag:
+        description: 'Tag to set on docker image (e.g. 0.0.1'
+        required: true
+
+jobs:
+  buildx:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+
+      - name: Prepare
+        id: prep
+        run: |
+          DOCKER_IMAGE=musicassistant/music-assistant-server
+          VERSION=latest
+          SHORTREF=${GITHUB_SHA::8}
+          MANUAL_TAG=${{ github.event.inputs.tag }}
+
+          # If a manual tag was supplied, use that
+          if [[ -n $MANUAL_TAG ]]; then
+            VERSION=${MANUAL_TAG}
+
+          # If this is git tag, use the tag name as a docker tag
+          elif [[ $GITHUB_REF == refs/tags/* ]]; then
+            VERSION=${GITHUB_REF#refs/tags/}
+          fi
+          TAGS="${DOCKER_IMAGE}:${VERSION},${DOCKER_IMAGE}:${SHORTREF}"
+
+          # If the VERSION looks like a version number, assume that
+          # this is the most recent version of the image and also
+          # tag it 'latest'.
+          if [[ $VERSION =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+            TAGS="$TAGS,${DOCKER_IMAGE}:latest"
+          fi
+
+          # Set output parameters.
+          echo ::set-output name=tags::${TAGS}
+          echo ::set-output name=docker_image::${DOCKER_IMAGE}
+
+      - name: Set up QEMU
+        uses: docker/setup-qemu-action@v1
+        with:
+          platforms: all
+
+      - name: Set up Docker Buildx
+        id: buildx
+        uses: docker/setup-buildx-action@v1
+
+      - name: Login to DockerHub
+        uses: docker/login-action@v1
+        with:
+          username: ${{ secrets.DOCKERHUB_USERNAME }}
+          password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+      - name: Build
+        uses: docker/build-push-action@v2
+        with:
+          builder: ${{ steps.buildx.outputs.name }}
+          context: .
+          file: ./Dockerfile
+          platforms: linux/amd64,linux/arm64,linux/armv7
+          push: true
+          tags: ${{ steps.prep.outputs.tags }}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644 (file)
index 0000000..c38b6a0
--- /dev/null
@@ -0,0 +1,29 @@
+FROM python:3.11.2-alpine3.16
+
+# Add Home Assistant wheels repository
+ENV WHEELS_LINKS=https://wheels.home-assistant.io/musllinux/
+
+# Install component packages
+RUN \
+    apk add --no-cache \
+        curl \
+        ffmpeg \
+        ffmpeg-libs \
+        git \
+        libjpeg-turbo \
+        mariadb-connector-c
+
+COPY . ./
+
+# Install mass wheel and dependencies
+RUN pip3 install --no-cache-dir --no-index --only-binary=:all: --find-links ${WHEELS_LINKS} \
+     .[server]
+
+
+EXPOSE 8095/tcp
+EXPOSE 9090/tcp
+EXPOSE 3483/tcp
+
+VOLUME [ "/data" ]
+
+ENTRYPOINT ["mass", "--config", "/data"]
diff --git a/compose.yml b/compose.yml
new file mode 100644 (file)
index 0000000..ca1a84a
--- /dev/null
@@ -0,0 +1,13 @@
+version: "3.8"
+services:
+  music-assistant-server:
+    build:
+      context: ./
+      dockerfile: Dockerfile
+    image: music-assistant-server:latest
+    container_name: music-assistant-server
+    restart: unless-stopped
+    # Required for player discovery to work correctly
+    network_mode: host
+    volumes:
+      - ${USERDIR:-$HOME}/docker/music-assistant-server/data:/data/
index 941789498d8a2b39ca62ac5050038e8274fea904..742ada6995acb2df8c2cd85a28dcf9d47556c26a 100644 (file)
@@ -5,10 +5,12 @@ import logging
 
 LOGGER = logging.getLogger(__name__)
 
+HA_WHEELS = "https://wheels.home-assistant.io/musllinux/"
+
 
 async def install_package(package: str) -> None:
     """Install package with pip, raise when install failed."""
-    cmd = f"python3 -m pip install {package}"
+    cmd = f"python3 -m pip install --find-links {HA_WHEELS} {package}"
     proc = await asyncio.create_subprocess_shell(
         cmd, stderr=asyncio.subprocess.PIPE, stdout=asyncio.subprocess.DEVNULL
     )