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"と共有される。