Skip to content

Commit

Permalink
improve Docker images (#1771) (#1909)
Browse files Browse the repository at this point in the history
* add ffmpeg variant
* remove 'v' prefix from tags
  • Loading branch information
aler9 authored Jun 7, 2023
1 parent 4dd518c commit ae88304
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 81 deletions.
4 changes: 2 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# do not add .git, since it is needed to extract the tag
# do not add /binaries, since they're needed by make dockerhub
/tmp
# do not add /tmp, since it is needed by make dockerhub
/binaries
/coverage*.txt
/apidocs/*.html
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
BASE_IMAGE = golang:1.20-alpine3.17
LINT_IMAGE = golangci/golangci-lint:v1.52.2
NODE_IMAGE = node:16-alpine3.17
ALPINE_IMAGE = alpine:3.17
RPI32_IMAGE = balenalib/raspberry-pi:bullseye-run
RPI64_IMAGE = balenalib/raspberrypi3-64:bullseye-run

Expand Down
30 changes: 19 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ Features:
* Reload the configuration without disconnecting existing clients (hot reloading)
* Read Prometheus-compatible metrics
* Run external commands when clients connect, disconnect, read or publish streams
* Natively compatible with the Raspberry Pi Camera
* Compatible with Linux, Windows and macOS, does not require any dependency or interpreter, it's a single executable

[![Test](https://github.com/bluenviron/mediamtx/workflows/test/badge.svg)](https://github.com/bluenviron/mediamtx/actions?query=workflow:test)
Expand All @@ -58,9 +57,9 @@ _rtsp-simple-server_ has been rebranded as _MediaMTX_. The reason is pretty obvi
## Table of contents

* [Installation](#installation)
* [Standard](#standard)
* [Docker](#docker)
* [OpenWRT](#openwrt)
* [Standalone binary](#standalone-binary)
* [Docker image](#docker-image)
* [OpenWRT package](#openwrt-package)
* [Basic usage](#basic-usage)
* [General](#general)
* [Configuration](#configuration)
Expand Down Expand Up @@ -114,7 +113,9 @@ _rtsp-simple-server_ has been rebranded as _MediaMTX_. The reason is pretty obvi

## Installation

### Standard
There are several installation methods available: standalone binary, Docker image and OpenWRT package.

### Standalone binary

1. Download and extract a precompiled binary from the [release page](https://github.com/bluenviron/mediamtx/releases).

Expand All @@ -124,23 +125,30 @@ _rtsp-simple-server_ has been rebranded as _MediaMTX_. The reason is pretty obvi
./mediamtx
```

### Docker
### Docker image

Download and launch the image:

```
docker run --rm -it --network=host aler9/rtsp-simple-server
docker run --rm -it --network=host aler9/rtsp-simple-server:latest
```

The `--network=host` flag is mandatory since Docker can change the source port of UDP packets for routing reasons, and this doesn't allow the server to find out the author of the packets. This issue can be avoided by disabling the UDP transport protocol:
Available images:

|name|FFmpeg included|RPI Camera support|
|----|---------------|------------------|
|aler9/rtsp-simple-server:latest|:x:|:x:|
|aler9/rtsp-simple-server:latest-ffmpeg|:heavy_check_mark:|:x:|
|aler9/rtsp-simple-server:latest-rpi|:x:|:heavy_check_mark:|
|aler9/rtsp-simple-server:latest-ffmpeg-rpi|:heavy_check_mark:|:heavy_check_mark:

The `--network=host` flag is mandatory since Docker can change the source port of UDP packets for routing reasons, and this doesn't allow the RTSP server to identify the senders of the packets. This issue can be avoided by disabling the UDP transport protocol:

```
docker run --rm -it -e MTX_PROTOCOLS=tcp -p 8554:8554 -p 1935:1935 -p 8888:8888 -p 8889:8889 aler9/rtsp-simple-server
```

Please keep in mind that the Docker image doesn't include _FFmpeg_. if you need to use _FFmpeg_ for an external command or anything else, you need to build a Docker image that contains both _rtsp-simple-server_ and _FFmpeg_, by following instructions [here](https://github.com/bluenviron/mediamtx/discussions/278#discussioncomment-549104).

### OpenWRT
### OpenWRT package

1. In a x86 Linux system, download the OpenWRT SDK corresponding to the wanted OpenWRT version and target from the [OpenWRT website](https://downloads.openwrt.org/releases/) and extract it.

Expand Down
8 changes: 5 additions & 3 deletions scripts/binaries.mk
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ WORKDIR /s
COPY go.mod go.sum ./
RUN go mod download
COPY . ./
ENV VERSION $(shell git describe --tags)
ARG VERSION
ENV CGO_ENABLED 0
RUN rm -rf binaries
RUN rm -rf tmp binaries
RUN mkdir tmp binaries
RUN cp mediamtx.yml LICENSE tmp/

Expand Down Expand Up @@ -71,6 +71,8 @@ endef
export DOCKERFILE_BINARIES

binaries:
echo "$$DOCKERFILE_BINARIES" | DOCKER_BUILDKIT=1 docker build . -f - -t temp
echo "$$DOCKERFILE_BINARIES" | DOCKER_BUILDKIT=1 docker build . -f - \
--build-arg VERSION=$$(git describe --tags) \
-t temp
docker run --rm -v $(PWD):/out \
temp sh -c "rm -rf /out/binaries && cp -r /s/binaries /out/"
131 changes: 66 additions & 65 deletions scripts/dockerhub.mk
Original file line number Diff line number Diff line change
@@ -1,110 +1,111 @@
REPOSITORY = aler9/rtsp-simple-server

define DOCKERFILE_DOCKERHUB
FROM scratch
ARG BINARY
ADD $$BINARY /
ARG TARGETPLATFORM
ADD tmp/binaries/$$TARGETPLATFORM.tar.gz /
ENTRYPOINT [ "/mediamtx" ]
endef
export DOCKERFILE_DOCKERHUB

define DOCKERFILE_DOCKERHUB_RPI_32
FROM $(RPI32_IMAGE) AS base
RUN apt update && apt install -y --no-install-recommends libcamera0 libfreetype6
ARG BINARY
ADD $$BINARY /
define DOCKERFILE_DOCKERHUB_FFMPEG
FROM $(ALPINE_IMAGE)
RUN apk add --no-cache ffmpeg
ARG TARGETPLATFORM
ADD tmp/binaries/$$TARGETPLATFORM.tar.gz /
ENTRYPOINT [ "/mediamtx" ]
endef
export DOCKERFILE_DOCKERHUB_RPI_32
export DOCKERFILE_DOCKERHUB_FFMPEG

define DOCKERFILE_DOCKERHUB_RPI_BASE_32
FROM $(RPI32_IMAGE)
endef
export DOCKERFILE_DOCKERHUB_RPI_BASE_32

define DOCKERFILE_DOCKERHUB_RPI_64
define DOCKERFILE_DOCKERHUB_RPI_BASE_64
FROM $(RPI64_IMAGE)
endef
export DOCKERFILE_DOCKERHUB_RPI_BASE_64

define DOCKERFILE_DOCKERHUB_RPI
FROM scratch
ARG TARGETPLATFORM
ADD tmp/rpi_base/$$TARGETPLATFORM.tar /
RUN apt update && apt install -y --no-install-recommends libcamera0 libfreetype6
ARG BINARY
ADD $$BINARY /
ADD tmp/binaries/$$TARGETPLATFORM.tar.gz /
ENTRYPOINT [ "/mediamtx" ]
endef
export DOCKERFILE_DOCKERHUB_RPI_64
export DOCKERFILE_DOCKERHUB_RPI

define DOCKERFILE_DOCKERHUB_FFMPEG_RPI
FROM scratch
ARG TARGETPLATFORM
ADD tmp/rpi_base/$$TARGETPLATFORM.tar /
RUN apt update && apt install -y --no-install-recommends libcamera0 libfreetype6 ffmpeg
ADD tmp/binaries/$$TARGETPLATFORM.tar.gz /
ENTRYPOINT [ "/mediamtx" ]
endef
export DOCKERFILE_DOCKERHUB_FFMPEG_RPI

dockerhub:
$(eval export DOCKER_CLI_EXPERIMENTAL=enabled)
$(eval VERSION := $(shell git describe --tags))
$(eval VERSION := $(shell git describe --tags | tr -d v))

docker login -u $(DOCKER_USER) -p $(DOCKER_PASSWORD)

rm -rf tmp
mkdir -p tmp tmp/binaries/linux/arm tmp/rpi_base/linux/arm

cp binaries/*linux_amd64.tar.gz tmp/binaries/linux/amd64.tar.gz
cp binaries/*linux_armv6.tar.gz tmp/binaries/linux/arm/v6.tar.gz
cp binaries/*linux_armv7.tar.gz tmp/binaries/linux/arm/v7.tar.gz
cp binaries/*linux_arm64v8.tar.gz tmp/binaries/linux/arm64.tar.gz

docker buildx rm builder 2>/dev/null || true
rm -rf $$HOME/.docker/manifests/*
docker buildx create --name=builder --use

echo "$$DOCKERFILE_DOCKERHUB" | docker buildx build . -f - \
--provenance=false \
--platform=linux/amd64 \
--build-arg BINARY="$$(echo binaries/*linux_amd64.tar.gz)" \
-t aler9/rtsp-simple-server:$(VERSION)-amd64 \
-t aler9/rtsp-simple-server:latest-amd64 \
--platform=linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8 \
-t $(REPOSITORY):$(VERSION) \
-t $(REPOSITORY):latest \
--push

echo "$$DOCKERFILE_DOCKERHUB" | docker buildx build . -f - \
echo "$$DOCKERFILE_DOCKERHUB_FFMPEG" | docker buildx build . -f - \
--provenance=false \
--platform=linux/arm/v6 \
--build-arg BINARY="$$(echo binaries/*linux_armv6.tar.gz)" \
-t aler9/rtsp-simple-server:$(VERSION)-armv6 \
-t aler9/rtsp-simple-server:latest-armv6 \
--platform=linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8 \
-t $(REPOSITORY):$(VERSION)-ffmpeg \
-t $(REPOSITORY):latest-ffmpeg \
--push

echo "$$DOCKERFILE_DOCKERHUB_RPI_32" | docker buildx build . -f - \
echo "$$DOCKERFILE_DOCKERHUB_RPI_BASE_32" | docker buildx build . -f - \
--provenance=false \
--platform=linux/arm/v6 \
--build-arg BINARY="$$(echo binaries/*linux_armv6.tar.gz)" \
-t aler9/rtsp-simple-server:$(VERSION)-armv6-rpi \
-t aler9/rtsp-simple-server:latest-armv6-rpi \
--push
--output type=tar,dest=tmp/rpi_base/linux/arm/v6.tar

echo "$$DOCKERFILE_DOCKERHUB" | docker buildx build . -f - \
echo "$$DOCKERFILE_DOCKERHUB_RPI_BASE_32" | docker buildx build . -f - \
--provenance=false \
--platform=linux/arm/v7 \
--build-arg BINARY="$$(echo binaries/*linux_armv7.tar.gz)" \
-t aler9/rtsp-simple-server:$(VERSION)-armv7 \
-t aler9/rtsp-simple-server:latest-armv7 \
--push
--output type=tar,dest=tmp/rpi_base/linux/arm/v7.tar

echo "$$DOCKERFILE_DOCKERHUB_RPI_32" | docker buildx build . -f - \
echo "$$DOCKERFILE_DOCKERHUB_RPI_BASE_64" | docker buildx build . -f - \
--provenance=false \
--platform=linux/arm/v7 \
--build-arg BINARY="$$(echo binaries/*linux_armv7.tar.gz)" \
-t aler9/rtsp-simple-server:$(VERSION)-armv7-rpi \
-t aler9/rtsp-simple-server:latest-armv7-rpi \
--push
--platform=linux/arm64/v8 \
--output type=tar,dest=tmp/rpi_base/linux/arm64.tar

echo "$$DOCKERFILE_DOCKERHUB" | docker buildx build . -f - \
echo "$$DOCKERFILE_DOCKERHUB_RPI" | docker buildx build . -f - \
--provenance=false \
--platform=linux/arm64/v8 \
--build-arg BINARY="$$(echo binaries/*linux_arm64v8.tar.gz)" \
-t aler9/rtsp-simple-server:$(VERSION)-arm64v8 \
-t aler9/rtsp-simple-server:latest-arm64v8 \
--platform=linux/arm/v6,linux/arm/v7,linux/arm64/v8 \
-t $(REPOSITORY):$(VERSION)-rpi \
-t $(REPOSITORY):latest-rpi \
--push

echo "$$DOCKERFILE_DOCKERHUB_RPI_64" | docker buildx build . -f - \
echo "$$DOCKERFILE_DOCKERHUB_FFMPEG_RPI" | docker buildx build . -f - \
--provenance=false \
--platform=linux/arm64/v8 \
--build-arg BINARY="$$(echo binaries/*linux_arm64v8.tar.gz)" \
-t aler9/rtsp-simple-server:$(VERSION)-arm64v8-rpi \
-t aler9/rtsp-simple-server:latest-arm64v8-rpi \
--platform=linux/arm/v6,linux/arm/v7,linux/arm64/v8 \
-t $(REPOSITORY):$(VERSION)-ffmpeg-rpi \
-t $(REPOSITORY):latest-ffmpeg-rpi \
--push

docker manifest create aler9/rtsp-simple-server:$(VERSION)-rpi \
$(foreach ARCH,armv6 armv7 arm64v8,aler9/rtsp-simple-server:$(VERSION)-$(ARCH)-rpi)
docker manifest push aler9/rtsp-simple-server:$(VERSION)-rpi

docker manifest create aler9/rtsp-simple-server:$(VERSION) \
$(foreach ARCH,amd64 armv6 armv7 arm64v8,aler9/rtsp-simple-server:$(VERSION)-$(ARCH))
docker manifest push aler9/rtsp-simple-server:$(VERSION)

docker manifest create aler9/rtsp-simple-server:latest-rpi \
$(foreach ARCH,armv6 armv7 arm64v8,aler9/rtsp-simple-server:$(VERSION)-$(ARCH)-rpi)
docker manifest push aler9/rtsp-simple-server:latest-rpi

docker manifest create aler9/rtsp-simple-server:latest \
$(foreach ARCH,amd64 armv6 armv7 arm64v8,aler9/rtsp-simple-server:$(VERSION)-$(ARCH))
docker manifest push aler9/rtsp-simple-server:latest

docker buildx rm builder
rm -rf $$HOME/.docker/manifests/*

0 comments on commit ae88304

Please sign in to comment.