rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

Docker版MirakurunのDockerfile

2025 Oct. 04.
2025 Sep. 23.
2025 Aug. 24.

container-init.shを用意する

参考: Docker版mirakurun:vim・ less・cron・ps組み込み、locale・タイムゾーン設定とcronの自動起動設定 - rokkonet

~/docker/docker-mirakurun-epgstation/mirakurun/container-init.sh

#!/bin/bash

export SERVER_CONFIG_PATH=/app-config/server.yml
export TUNERS_CONFIG_PATH=/app-config/tuners.yml
export CHANNELS_CONFIG_PATH=/app-config/channels.yml
export SERVICES_DB_PATH=/app-data/services.json
export PROGRAMS_DB_PATH=/app-data/programs.json
export LOGO_DATA_DIR_PATH=/app-data/logo-data

export PATH=/opt/bin:$PATH
export DOCKER=YES
export INIT_PID=$$

# tweaks for glibc memory usage
export MALLOC_ARENA_MAX=2

# trap
function trap_exit() {
  echo "stopping... $(jobs -p)"
  kill $(jobs -p) > /dev/null 2>&1 || echo "already killed."
  /etc/init.d/pcscd stop
  sleep 1
  echo "exit."
}
trap "exit 0" 2 3 15
trap trap_exit 0

if [ ! -e "/opt/bin" ]; then
  mkdir -pv /opt/bin
fi

# rename wrong filename (migration from <= 3.1.1 >= 3.0.0)
if [ -f "/app-data/services.yml" -a ! -f "$SERVICES_DB_PATH" ]; then
  cp -v "/app-data/services.yml" "$SERVICES_DB_PATH"
fi
if [ -f "/app-data/programs.yml" -a ! -f "$PROGRAMS_DB_PATH" ]; then
  cp -v "/app-data/programs.yml" "$PROGRAMS_DB_PATH"
fi

# custom startup script
if [ -e "/opt/bin/startup" ]; then
  echo "executing /opt/bin/startup..."
  /opt/bin/startup
  echo "done."
fi

# only for test purpose
if !(type "arib-b25-stream-test" > /dev/null 2>&1); then
  npm --prefix /opt install arib-b25-stream-test
  ln -sv /opt/node_modules/arib-b25-stream-test/bin/b25 /opt/bin/arib-b25-stream-test
fi

if [ -e "/etc/init.d/pcscd" ]; then
  while :; do
    echo "starting pcscd..."
    /etc/init.d/pcscd start
    sleep 1
    timeout 2 pcsc_scan | grep -A 50 "Using reader plug'n play mechanism"
    if [ $? = 0 ]; then
      break;
    fi
    echo "failed!"
  done
fi

# start cron
echo "starting cron..."
service cron start

function start() {
  if [ "$DEBUG" != "true" ]; then
    export NODE_ENV=production
    node -r source-map-support/register lib/server.js &
  else
    npm run debug &
  fi

  wait
}

function restart() {
  echo "restarting... $(jobs -p)"
  kill $(jobs -p) > /dev/null 2>&1 || echo "already killed."
  sleep 1
  start
}
trap restart 1

start


Dockerfileを作成する

dvbv5_channels_isdbs.confファイルの修正有無での記述の違いに注意する。


~/docker/docker-mirakurun-epgstation/mirakurun/my.Dockerfile

FROM chinachu/mirakurun:latest

# 一時、次のリポジトリ変更を要することがあった。
# Debian Buster の公式リポジトリを archive.debian.org に切り替え
# RUN echo 'Acquire::Check-Valid-Until "false";' > /etc/apt/apt.conf.d/99no-check-valid-until \
#  && sed -i 's|http://deb.debian.org/debian|http://archive.debian.org/debian|g' /etc/apt/sources.list \
#  && sed -i 's|http://deb.debian.org/debian-security|http://archive.debian.org/debian-security|g' /etc/apt/sources.list

# 次のCOPY行はdvbv5_channels_isdbs.confファイルを修正した時に記述する
#COPY ./conf/dvbv5_channels_isdbs.conf /app/config/dvbconf-for-isdb/conf/dvbv5_channels_isdbs.conf

RUN apt-get update && apt-get install -y --no-install-recommends \
    vim \
    less \
    cron \
    curl \
    jq \
    ffmpeg \
    locales \
    tzdata \
    procps \
    && rm -rf /var/lib/apt/lists/* \
    && echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen \
    && locale-gen \
    && update-locale LANG=ja_JP.UTF-8 \
    && ln -snf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
    && echo Asia/Tokyo > /etc/timezone \
    && dpkg-reconfigure -f noninteractive tzdata \
    && touch /var/log/cron.log \
    && mkdir -p \
        /app-recorded \
        /app-data/bin \
        /app-data/log

# /app-data/bin を PATH に追加
ENV PATH="/app-data/bin:${PATH}"

# replace container-init.sh with my container-init.sh
COPY ./container-init.sh /app/docker/container-init.sh
RUN chmod +x /app/docker/container-init.sh