rokkonet

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

TV録画システム構築:Xubuntu 24.04 / Linux + PT2 TVチューナー + Docker版Mirakurun + Docker版MySQL + Docker版EPGStation

2024 Sep. 15.
2024 May 19.
2024 May 01.

(手順)

PCにPT2チューナー、B-CAS ICカードリーダ、録画ファイル保存用ストレージを接続する。



ロケールタイムゾーンを設定する

$ sudo apt update
$ sudo apt install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
$ sudo timedatectl set-timezone Asia/Tokyo


時刻サーバーに同期させる

# /etc/systemd/timesyncd.conf に次の設定を記述する
NTP=ntp.nict.jp
FallbackNTP=ntp1.jst.mfeed.ad.jp ntp2.jst.mfeed.ad.jp ntp3.jst.mfeed.ad.jp

# サービス再起動
$ sudo systemctl restart systemd-timesyncd

# 状態確認
$ systemctl status systemd-timesyncd


ビルドツール、インストールツールをインストール

$ sudo apt install build-essential git unzip dkms pkg-config automake cmake curl libssl-dev libtool libboost-all-dev yasm


(オプション)swapを無効化する

$ sudo swapoff --all
$ sudo reboot


(オプション)/tmpをtmpfsにする

/etc/fstabに次の行を書き込み、システムを再起動する。
tmpfs /tmp tmpfs defaults,noatime 0 0


(オプション)ログをRAMディスクに書き込むようにする

$ echo "deb http://packages.azlux.fr/debian/ buster main" | sudo tee /etc/apt/sources.list.d/azlux.list
$ wget -qO - https://azlux.fr/repo.gpg.key | sudo apt-key add -
$ sudo apt update
$ sudo apt install -y log2ram

/etc/log2ram.confのSIZEとUSE_RSYNCの設定を次のようにする。
SIZE=256MB
USE_RSYNC=true

システムを再起動する。

$ sudo reboot

稼働確認

$ df -h | grep "log2ram"
log2ram         256M   60M  197M  24% /var/log


チューナー PT2がPCに接続されていることを確認

$ lspci
03:00.0 Multimedia controller: Xilinx Corporation Device 222a (rev 01)


PT2デバイスを確認

PT2をPCに装着してLinuxを起動すると自動的に/dev/dvb/以下にブロック型デバイスが作成される。

$ ls /dev/dvb/
adapter0  adapter1  adapter2  adapter3


次の記事を参考に、B-CASカードリーダをXubuntuにインストールする

ICカードリーダライタSCR3310-NTTComをxubuntuにインストール - rokkonet


pcscdを停止する

Mirakurunでは pcscdが稼働していてはいけない。

$ sudo systemctl stop pcscd.socket
$ sudo systemctl disable pcscd.socket
$ pcsc_scan
 次の出力があれば成功
  SCardEstablishContext: Service not available.


dvb-tools(TV受信コマンドdvbv5-zap)をインストール

$ sudo apt install dvb-tools


b25デコードツールはmirakurunに含まれているのでインストール不要



Docker、docker-composeをインストール

docker-composeをインストールすると「distutilsファイルがない」とのエラーになるのでdocker-compose-v2をインストールする。
$ sudo apt update && sudo apt install docker.io docker-compose-v2

Dockerがインストールされたことを確認する。
$ docker version

Dockerの自動起動設定
$ sudo systemctl enable docker.service
$ systemctl status docker.service

dockerが稼働していなければ
$ sudo systemctl start docker.service


Docker版のMirakurun、MySQL、EPGStationを運用する任意の一般ユーザーを決める(ここではtvユーザーとする)

tvユーザーをdockerグループ、sudoグループに所属させ、ログインしなおす

・所属グループ追加コマンド例

$ sudo usermod -aG docker,sudo tv


いったんXubuntuからログアウトし、tvユーザーで再度ログインする



tvユーザーのホームディレクトリ内にdockerディレクトリを作成する

$ su - tv
$ mkdir ~/docker


Docker版mirakurun-epgstationをインストールする

GitHub - l3tnun/docker-mirakurun-epgstation: Mirakurun + EPGStation on Docker ]のとおりだが、次の変更を行った。

  • docker-composeコマンドをroot権限で実行しないようにした。
  • docker-compose-v2ではsetup.sh内のdocker-composeコマンドが通らず、"docker compose"にする必要があるので、"curl -sf https://raw.githubusercontent.com/l3tnun/docker-mirakurun-epgstation/v2/setup.sh | sh -s cd docker-mirakurun-epgstation"を実行せず、下記コマンドを実行する。

    docker-compose-v2でのDocker版mirakurun-epgstationのインストール
$ cd ~/docker
$ git clone https://github.com/l3tnun/docker-mirakurun-epgstation.git
$ cd ~/docker/docker-mirakurun-epgstation
$ cp docker-compose-sample.yml docker-compose.yml && \
  cp epgstation/config/enc.js.template epgstation/config/enc.js && \
  cp epgstation/config/config.yml.template epgstation/config/config.yml && \
  cp epgstation/config/operatorLogConfig.sample.yml epgstation/config/operatorLogConfig.yml && \
  cp epgstation/config/epgUpdaterLogConfig.sample.yml epgstation/config/epgUpdaterLogConfig.yml && \
  cp epgstation/config/serviceLogConfig.sample.yml epgstation/config/serviceLogConfig.yml
$ docker compose run --rm -e SETUP=true mirakurun


~/docker/docker-mirakurun-epgstation/docker-compose.yml を修正する

MySQLで利用するディレクトリとして、tvユーザーのホームディレクトリに mysql-share ディレクトリを作成しておく。

$ mkdir ~/mysql-share
$ chmod 777 ~/mysql-share


録画ファイルをコンテナ外で保存するように、epgstationのvolumesセクションを修正する。

(書式)
 - ホスト側の(docker-compose.ymlから見た相対)パス:コンテナの絶対パス

録画サムネイルファイル保存用と録画ファイル保存用のホスト側ディレクトリは以下とした。

  • コンテナ内のthumbnailに結びつけるホスト側ディレクトリ:/var/bigdata/01/epgstation240501/thumbnail
  • コンテナ内のrecordedに結びつけるホスト側ディレクトリ:/var/bigdata/01/epgstation240501/video


変更内容

  • 52行目あたりの"- ./epgstation/thumbnail:/app/thumbnail"の:(コロン)の前は録画サムネイルファイル保存ディレクトリのパスにする。
  • 54行目あたりの"- ./recorded:/app/recorded"の:(コロン)の前は録画ファイル保存ディレクトリのパスにする。
  • [servicesセクション -> mysql -> environment] のMYSQL_ROOT_PASSWORD変数にmysqlのrootユーザーのパスワードを記述する。(デフォルトではepgstationになっている)
  • mysqlコンテナとホストとのデータ共有のために、30行目あたりの[servicesセクション -> mysql -> volumes] に次の行を挿入する。
      - /home/tv-USER/mysql-share:/tmp

docker-compose.yml のvolumesへの具体記述
  - /var/bigdata/01/epgstation240501/thumbnail:/app/thumbnail
  - /var/bigdata/01/epgstation240501/video:/app/recorded
  - /home/tv-xubuntu2404/mysql-share:/tmp


Mirakurunの tuners.yml は自動作成されるので、作業不要。



Mirakurun用チャンネル情報ファイルを作成する

$ cd ~/docker/docker-mirakurun-epgstation/mirakurun/conf
$ sudo cp channels.yml channels.yml.original

参考 mirakurun BSCSチャンネル設定(2024/06/01現在) · GitHub

次の内容で ~/docker/docker-mirakurun-epgstation/mirakurun/conf/channels.yml を作成する。
~/docker/docker-mirakurun-epgstation/mirakurun/conf/ 内のファイルのオーナーはrootユーザーになっているので、
"$ sudo vim ~/docker/docker-mirakurun-epgstation/mirakurun/conf/channels.yml"とかで編集する。

神戸チャンネル フォーマット
(見ないチャンネルには "isDisabled: true"行を書き込む)

- name: NHK総合
  type: GR
  channel: '22'
  isDisabled: false
- name: NHKEテレ
  type: GR
  channel: '13'
  isDisabled: false
- name: サンテレビ
  type: GR
  channel: '26'
  isDisabled: false
- name: MBS毎日放送
  type: GR
  channel: '16'
  isDisabled: false
- name: ABCテレビ
  type: GR
  channel: '15'
  isDisabled: false
- name: テレビ大阪
  type: GR
  channel: '18'
  isDisabled: false
- name: 関西テレビ
  type: GR
  channel: '17'
  isDisabled: false
- name: 読売テレビ
  type: GR
  channel: '14'
  isDisabled: false
- name: J:COMテレビ
  type: GR
  channel: '19'
  isDisabled: false
- name: J:COMチャンネル
  type: GR
  channel: '24'
  isDisabled: false
- name: NHK BS1
  type: BS
  channel: BS15_0
  serviceId: 101
- name: NHK BSプレミアム
  type: BS
  channel: BS03_1
  serviceId: 103
- name: BS日テレ
  type: BS
  channel: BS13_0
  serviceId: 141
- name: BS朝日
  type: BS
  channel: BS01_0
  serviceId: 151
- name: BS-TBS
  type: BS
  channel: BS01_1
  serviceId: 161
- name: BSテレ東
  type: BS
  channel: BS01_2
  serviceId: 171
- name: BSフジ
  type: BS
  channel: BS13_1
  serviceId: 181
- name: WOWOWプライム
  type: BS
  channel: BS03_0
  serviceId: 191
  isDisabled: true
- name: WOWOWライブ
  type: BS
  channel: BS05_0
  serviceId: 192
  isDisabled: true
- name: WOWOWシネマ
  type: BS
  channel: BS05_1
  serviceId: 193
  isDisabled: true
- name: スター・チャンネル1
  type: BS
  channel: BS09_1
  serviceId: 200
  isDisabled: true
- name: スター・チャンネル2
  type: BS
  channel: BS15_1
  serviceId: 201
  isDisabled: true
- name: スター・チャンネル3
  type: BS
  channel: BS15_1
  serviceId: 202
  isDisabled: true
- name: BS11
  type: BS
  channel: BS09_0
  serviceId: 211
- name: TwellV
  type: BS
  channel: BS09_2
  serviceId: 222
- name: 放送大学 BS1
  type: BS
  channel: BS11_0
  serviceId: 231
- name: 放送大学 BS2
  type: BS
  channel: BS11_0
  serviceId: 232
- name: グリーンチャンネル
  type: BS
  channel: BS21_2
  serviceId: 234
  isDisabled: true
- name: BSアニマックス
  type: BS
  channel: BS13_2
  serviceId: 236
  isDisabled: true
- name: J SPORTS 1
  type: BS
  channel: BS19_1
  serviceId: 242
  isDisabled: true
- name: J SPORTS 2
  type: BS
  channel: BS19_2
  serviceId: 243
  isDisabled: true
- name: J SPORTS 3
  type: BS
  channel: BS19_3
  serviceId: 244
  isDisabled: true
- name: J SPORTS 4
  type: BS
  channel: BS19_0
  serviceId: 245
  isDisabled: true
- name: BS釣りビジョン
  type: BS
  channel: BS11_1
  serviceId: 251
  isDisabled: true
- name: WOWOWプラス
  type: BS
  channel: BS21_0
  serviceId: 252
  isDisabled: true
- name: 日本映画専門チャンネル
  type: BS
  channel: BS21_1
  serviceId: 255
  isDisabled: true
- name: ディズニー・チャンネル
  type: BS
  channel: BS23_0
  serviceId: 256
  isDisabled: true
- name: BS松竹東急
  type: BS
  channel: BS23_3
  serviceId: 260
- name: BSJapanext
  type: BS
  channel: BS23_2
  serviceId: 263
- name: BSよしもと
  type: BS
  channel: BS23_1
  serviceId: 265


EPGStationの設定を行う

~/docker/docker-mirakurun-epgstation/epgstation/config/config.yml に下記の修正(mysql文字コード指定、録画ファイル名フォーマット)を行う。

$ diff -u config.yml.original config.yml
--- config.yml.original 2024-05-03 11:40:10.068198955 +0900
+++ config.yml  2024-05-03 11:52:43.442341934 +0900
@@ -14,13 +14,14 @@
     user: epgstation
     password: epgstation
     database: epgstation
+    charset: utf8mb4
 
 epgUpdateIntervalTime: 10
 
 conflictPriority: 1
 recPriority: 2
 
-recordedFormat: '%YEAR%年%MONTH%月%DAY%日%HOUR%時%MIN%分%SEC%秒-%TITLE%'
+recordedFormat: '%SHORTYEAR%%MONTH%%DAY%%HOUR%%MIN%%TYPE%%CH%-%SID%-%CHNAME%-%TITLE%'
 recordedFileExtension: .m2ts
 recorded:
     - name: recorded


H.264エンコード設定増設

音声欠落を防ぐため、冒頭4秒間をカットして H.264エンコードする設定を追加する

参考
  EPGStationで使うFFmpeg 4.2.4のオプション設定を考える - Simple Life in the digital age

副音声付き/音声多重TV録画tsファイルのmp4へのトランスコード - rokkonet

(1) エンコードスクリプトを作成する
次の内容で ${HOME}/docker/docker-mirakurun-epgstation/epgstation/config/enc-cut4secs.js をファイル属性644で作成する。

const spawn = require('child_process').spawn;
const ffmpeg = process.env.FFMPEG;

const input = process.env.INPUT;
const output = process.env.OUTPUT;
const analyzedurationSize = '10M'; // Mirakurun の設定に応じて変更すること
const probesizeSize = '32M'; // Mirakurun の設定に応じて変更すること
const maxMuxingQueueSize = 1024;
const dualMonoMode = 'main';
const videoHeight = parseInt(process.env.VIDEORESOLUTION, 10);
const isDualMono = parseInt(process.env.AUDIOCOMPONENTTYPE, 10) == 2;
const audioBitrate = videoHeight > 720 ? '192k' : '128k';
const preset = 'veryfast';
const codec = 'libx264';
const crf = 23;

const args = ['-ss', '4', '-y', '-analyzeduration', analyzedurationSize, '-probesize', probesizeSize];

// dual mono 設定
if (isDualMono) {
    Array.prototype.push.apply(args, ['-dual_mono_mode', dualMonoMode]);
}

// input 設定
Array.prototype.push.apply(args,['-i', input]);

// メタ情報を先頭に置く
Array.prototype.push.apply(args,['-movflags', 'faststart']);

// 字幕データを含めたストリームをすべてマップ
// Array.prototype.push.apply(args, ['-map', '0', '-ignore_unknown', '-max_muxing_queue_size', maxMuxingQueueSize, '-sn']);

// video filter 設定
let videoFilter = 'yadif';
if (videoHeight > 720) {
    videoFilter += ',scale=-2:720'
}
Array.prototype.push.apply(args, ['-vf', videoFilter]);

// その他設定
Array.prototype.push.apply(args,[
    '-preset', preset,
    '-aspect', '16:9',
    '-c:v', codec,
    '-crf', crf,
    '-f', 'mp4',
    '-c:a', 'aac',
    '-ar', '48000',
    '-ab', audioBitrate,
    '-ac', '2',
    output
]);

let str = '';
for (let i of args) {
    str += ` ${ i }`
}
console.error(str);

const child = spawn(ffmpeg, args);

child.stderr.on('data', (data) => { console.error(String(data)); });

child.on('error', (err) => {
    console.error(err);
    throw new Error(err);
});

process.on('SIGINT', () => {
    child.kill('SIGINT');
});

(2) EPGStationに enc-cut4secs.js によるエンコード設定を組み込む
${HOME}/docker/docker-mirakurun-epgstation/epgstation/config/config.yml のencodeブロックに設定を記述する。
"- name:"で始め、変換コマンドjsファイル・拡張子・録画後タイムアウト時間(秒)を指定する。

設定例

encode:
   #### デフォルトの設定 ####
    - name: H.264
      cmd: '%NODE% %ROOT%/config/enc.js'
      suffix: .mp4
      rate: 4.0

   #### enc-cut4secs.js によるエンコード設定 ####
    - name: H.264-cut4secs
      cmd: '%NODE% %ROOT%/config/enc-cut4secs.js'
      suffix: .mp4
      rate: 4.0


NHK BSドキュメンタリー、NHK19時ニュース H.264エンコード設定増設

(1) エンコードスクリプトを作成する
次の内容で ${HOME}/docker/docker-mirakurun-epgstation/epgstation/config/enc-bs_docu-cut4secs.js をファイル属性644で作成する。

const spawn = require('child_process').spawn;
const ffmpeg = process.env.FFMPEG;

const input = process.env.INPUT;
const output = process.env.OUTPUT;
const analyzedurationSize = '10M'; // Mirakurun の設定に応じて変更すること
const probesizeSize = '32M'; // Mirakurun の設定に応じて変更すること
const maxMuxingQueueSize = 1024;
const videoHeight = parseInt(process.env.VIDEORESOLUTION, 10);
const isDualMono = parseInt(process.env.AUDIOCOMPONENTTYPE, 10) == 2;
const audioBitrate = videoHeight > 720 ? '192k' : '128k';
const preset = 'veryfast';
const codec = 'libx264';
const crf = 23;


const args = ['-ss', '4', '-y', '-analyzeduration', analyzedurationSize, '-probesize', probesizeSize];

// input 設定
Array.prototype.push.apply(args,['-i', input]);

// メタ情報を先頭に置く
Array.prototype.push.apply(args,['-movflags', 'faststart']);

// video filter 設定
let videoFilter = 'yadif';
if (videoHeight > 720) {
    videoFilter += ',scale=-2:720'
}
Array.prototype.push.apply(args, ['-vf', videoFilter]);

// その他設定
Array.prototype.push.apply(args,[
    '-preset', preset,
    '-aspect', '16:9',
    '-c:v', codec,
    '-crf', crf,
    '-f', 'mp4',
    '-map', '0:v',
    '-map', '0:a:0',
    '-map', '0:a:1',
    '-ignore_unknown',
    '-sn',
    '-dn',
    '-metadata:s:a:0 title=main',
    '-metadata:s:a:0 language=jpn',
    '-metadata:s:a:1 title=sub',
    '-metadata:s:a:1 language=jpn',
    '-c:a, 'aac',
    '-strict',
    '-2',
    '-ar', '48000',
    '-ab', '192k',
    '-ac', '2',
    '-loglevel', 'error'
 ]);

// output設定
Array.prototype.push.apply(args,[output]);

let str = '';
for (let i of args) {
    str += ` ${ i }`
}
console.error(str);

const child = spawn(ffmpeg, args);

child.stderr.on('data', (data) => { console.error(String(data)); });

child.on('error', (err) => {
    console.error(err);
    throw new Error(err);
});

process.on('SIGINT', () => {
    child.kill('SIGINT');
});


(2) EPGStationに enc-bs_docu-cut4secs.js によるエンコード設定を組み込む
${HOME}/docker/docker-mirakurun-epgstation/epgstation/config/config.yml のencodeブロックに設定を記述する。
"- name:"で始め、変換コマンドjsファイル・拡張子・録画後タイムアウト時間(秒)を指定する。

設定例

encode:
   #### デフォルトの設定 ####
    - name: H.264
      cmd: '%NODE% %ROOT%/config/enc.js'
      suffix: .mp4
      rate: 4.0

   #### enc-cut4secs.js によるエンコード設定 ####
    - name: H.264-cut4secs
      cmd: '%NODE% %ROOT%/config/enc-cut4secs.js'
      suffix: .mp4
      rate: 4.0

   #### enc-bs_docu-cut4secs.js によるエンコード設定 ####
    - name: H.264-nhk_bs_docu-cut4secs
      cmd: '%NODE% %ROOT%/config/enc-bs_docu-cut4secs.js'
      suffix: .mp4
      rate: 4.0


(参考)デフォルトの ${HOME}/docker/docker-mirakurun-epgstation/epgstation/config/enc.js の内容

const spawn = require('child_process').spawn;
const ffmpeg = process.env.FFMPEG;

const input = process.env.INPUT;
const output = process.env.OUTPUT;
const analyzedurationSize = '10M'; // Mirakurun の設定に応じて変更すること
const probesizeSize = '32M'; // Mirakurun の設定に応じて変更すること
const maxMuxingQueueSize = 1024;
const dualMonoMode = 'main';
const videoHeight = parseInt(process.env.VIDEORESOLUTION, 10);
const isDualMono = parseInt(process.env.AUDIOCOMPONENTTYPE, 10) == 2;
const audioBitrate = videoHeight > 720 ? '192k' : '128k';
const preset = 'veryfast';
const codec = 'libx264';
const crf = 23;

const args = ['-y', '-analyzeduration', analyzedurationSize, '-probesize', probesizeSize];

// dual mono 設定
if (isDualMono) {
    Array.prototype.push.apply(args, ['-dual_mono_mode', dualMonoMode]);
}

// input 設定
Array.prototype.push.apply(args,['-i', input]);

// メタ情報を先頭に置く
Array.prototype.push.apply(args,['-movflags', 'faststart']);

// 字幕データを含めたストリームをすべてマップ
// Array.prototype.push.apply(args, ['-map', '0', '-ignore_unknown', '-max_muxing_queue_size', maxMuxingQueueSize, '-sn']);

// video filter 設定
let videoFilter = 'yadif';
if (videoHeight > 720) {
    videoFilter += ',scale=-2:720'
}
Array.prototype.push.apply(args, ['-vf', videoFilter]);

// その他設定
Array.prototype.push.apply(args,[
    '-preset', preset,
    '-aspect', '16:9',
    '-c:v', codec,
    '-crf', crf,
    '-f', 'mp4',
    '-c:a', 'aac',
    '-ar', '48000',
    '-ab', audioBitrate,
    '-ac', '2',
    output
]);

let str = '';
for (let i of args) {
    str += ` ${ i }`
}
console.error(str);

const child = spawn(ffmpeg, args);

child.stderr.on('data', (data) => { console.error(String(data)); });

child.on('error', (err) => {
    console.error(err);
    throw new Error(err);
});

process.on('SIGINT', () => {
    child.kill('SIGINT');
});


TV録画システム起動

$ cd ~/docker/docker-mirakurun-epgstation
$ docker compose up -d
最初は初期化が済むまでかなりの時間を要する


トラブル等でのログの確認

$ su - tv
$ docker logs docker-mirakurun-epgstation-epgstation-1


稼働しているTV録画システムの終了と再起動

録画ファイル・サムネイルファイル・mysql内の情報(予約情報・録画情報等)は削除されない。

$ cd ~/docker/docker-mirakurun-epgstation

(終了)
$ docker compose down

(起動)
$ docker compose up -d


稼働しているDockerコンテナの、データ削除を伴う終了

注意
mysql内の情報(予約情報・録画情報等)等、コンテナ内のデータは削除される。
録画ファイル・サムネイルファイルはコンテナ外に保存していない限り削除される。

$ cd ~/docker/docker-mirakurun-epgstation
$ docker compose down -v

"docker-compose down -v"コマンドにおける"-v"オプションは、Docker Composeで実行されたコンテナのボリュームを削除するためのオプション。
通常、"docker-compose down"コマンドは、Docker Composeで起動されたサービスやコンテナを停止し、それらを削除する。
しかし、"-v"オプションを付けることで、それに加えて関連するボリュームも削除される。


"docker-compose down"コマンドについて

docker-compose down

Composeファイルで定義されたサービスを停止し、関連するコンテナを削除するが、ボリューム(データ)は削除されない。
つまり、ボリュームデータは残る。

docker-compose down -v

Composeファイルで定義されたサービスを停止し、関連するコンテナを削除するだけでなく、ボリューム(データ)も削除する。
つまり、ボリュームデータも一緒に削除される。

したがって、ボリュームデータを保持して再利用したい場合は、"docker-compose down"コマンドを使用し、ボリュームデータも削除したい場合は、"docker-compose down -v"コマンドを使用する。


設定変更手順

参考ページ Docker Composeにおける各種ファイルの変更時の反映 #docker-compose - Qiita

docker-compose.ymlを修正する場合

コンテナを再構築して、再起動する。

要注意

mysql内の情報(予約情報・録画情報等)等、コンテナ内のデータは削除される。
録画ファイル・サムネイルファイルはコンテナ外に保存していない限り削除される。

手順
  • コンテナを終了・削除する。
$ cd ~/docker/docker-mirakurun-epgstation
$ docker compose down -v


  • 設定変更作業を行う。


  • コンテナを起動する。
$ docker compose up -d


Dockerfileを修正する場合

イメージとコンテナを再構築して、再起動する。

要注意

mysql内の情報(予約情報・録画情報等)等、コンテナ内のデータは削除される。
録画ファイル・サムネイルファイルはコンテナ外に保存していない限り削除される。

手順
  • コンテナを終了・削除する。
$ cd ~/docker/docker-mirakurun-epgstation
$ docker compose down -v


  • 設定変更作業を行う。


  • イメージ取得・ビルド・コンテナ起動を行う。
$ docker compose build --pull
$ docker compose up -d

"--pull"オプションを使用すると、Composeがビルドプロセスの一部としてイメージをプルするように指示する。つまり、ローカルにそのイメージが存在しない場合でも、常に最新のイメージを取得してビルドする。これにより、常に最新の状態でアプリケーションをビルドおよび実行できる。


EPGStationコンテナの停止

$ cd ~/docker/docker-mirakurun-epgstation
$ docker compose kill epgstation
$ docker compose rm -f epgstation

"docker-compose kill"コマンドは、Composeで定義されたサービスのコンテナを強制的に停止するが、ボリュームデータを削除しない。このコマンドは単にコンテナを停止するだけであり、ボリュームデータには影響を与えない。

"docker-compose rm -f"コマンドは、Composeファイルで定義されたサービスのコンテナを強制的に削除する。このコマンドを実行すると、実行中のコンテナを強制的に停止し、その後削除する。ボリュームデータは削除されない。つまり、関連するコンテナが削除されるが、ボリュームデータは残る。

epgstation以外でのmysqlの利用

tvユーザでmysqlコンテナに入ってmysqlを利用する。

(tvユーザでログインする)
$ su - tv

(mysqlコンテナIDを確認する)
$ docker ps

(mysqlコンテナに入る)
$ docker exec -it MYSQLCONTAINERID /bin/bash

(mysqlクライアントを起動する)
# mysql -u USER -p DATABASE

コンテナ外とのデータ共有

docker-compose.ymlに"- /home/tv-USER/mysql-share:/tmp"を記述したので、コンテナ内の"/tmp"ディレクトリがホストの"/home/tv-USER/mysql-share"と共有される。