Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ffmpegを入れたdckerfileの扱い #541

Closed
5ym opened this issue Sep 23, 2021 · 24 comments
Closed

ffmpegを入れたdckerfileの扱い #541

5ym opened this issue Sep 23, 2021 · 24 comments

Comments

@5ym
Copy link
Contributor

5ym commented Sep 23, 2021

現状先日の更新でDockerfile.ubuntu-nvencを追加してると思うのですが,これだけffmpegを入れるのもおかしな話なので,docker-mirakurun-epgstationのプロジェクトのほうに移すのはいかがでしょうか

@kazuki0824
Copy link
Contributor

kazuki0824 commented Oct 15, 2021

@5ym 先日そのPRを立てた者です。今思うとその方がよかったかと思います。。。すみません。

流れとしては

  1. 既存のDebianのもののFROMをUbuntu+CUDAのイメージ(NVIDIA公式)ベースに替えたものをこちら側のリポジトリに用意し、Dockerイメージとしてアップ
    2.それを拾いその上にffmpegをビルドするようなDockerfileを、向こうのリポジトリに用意する

という形になるでしょうか

@5ym
Copy link
Contributor Author

5ym commented Oct 15, 2021

そもそもcudaのライブラリって後から入れられない感じですか?イメージにバンドルされているものしか利用できない感じですか?

@kazuki0824
Copy link
Contributor

あとから入れるというのがよく分かりませんが、マストな順序関係としては「ffmpegを入れるよりも前に入れないといけない」です。(ffmpegのビルドにCUDA専用のコンパイラnvccや付属のライブラリを使用するため)

イメージにバンドルされているものの話については、イメージの元になるDockerfileが公開されているので、既成のイメージに頼らずに自前でレシピを構築することも確かにできます。しかし、総ステップ数がそこそこあるのでFROMで持ってくる形にするのでいいんじゃないかと個人的には思っていました。

##補足
Dockerfileとしては3種類存在しています。順に入れ子になっていて、今回最も大きいdevelが必要です。(ffmpeg をビルドするため)
それぞれ中でNVIDIA公式のaptのリポジトリからdebを引っ張ってきてインストール、環境変数の設定という感じです。
これらを全部自分たちのリポジトリに書き写すのはナンセンスな気がしていたので、FROMでdevelを取ってくるという方法を採用しました

@5ym
Copy link
Contributor Author

5ym commented Oct 16, 2021

情報ありがとうございます。
少し面倒ですが、既存のepgstationのイメージからビルド済みプロジェクトファイルだけ抽出してcudaのイメージ内で使用するというのはどうでしょうか

@5ym
Copy link
Contributor Author

5ym commented Oct 16, 2021

下記のような感じです

FROM l3tnun/epgstation:master as build

FROM nvidia/cuda:11.4.1-devel-ubuntu20.04

COPY --from=builder /app /app/

@5ym
Copy link
Contributor Author

5ym commented Oct 16, 2021

これなら記述を最小限でdocker-mirakurun-epgstationに統合できると思います

@kazuki0824
Copy link
Contributor

情報ありがとうございます。いいと思います。
また、実行時はruntimeのイメージがあれば十分なので、同じ要領で更にサイズ削減できそうです
それを取り入れたPRを作ってみます。

@l3tnun
Copy link
Owner

l3tnun commented Oct 24, 2021

返信遅くなってしまって、すいません。

現状先日の更新でDockerfile.ubuntu-nvencを追加してると思うのですが,これだけffmpegを入れるのもおかしな話なので,>docker-mirakurun-epgstationのプロジェクトのほうに移すのはいかがでしょうか

@5ym さんのおっしゃるとおりですね。
メンテナンスも大変ですし、docker-mirakurun-epgstation の方に移したいと思います。

それにともなって @5ym さんが提示されている、l3tnun/epgstation:master からファイルをコピーする方法であれば、
epgstation として nvenc 用のイメージを用意する必要はないと思いました。
ですので、nvenc 用のイメージ作成部分を削除 (#535, #539, #549) を手動で revert し、
docker-mirakurun-epgstation に nvenc 用の Dockerfile に追加しようと思いますがいかがでしょうか?

To @kazuki0824

@kazuki0824
Copy link
Contributor

@l3tnun
概ね賛成です。

提案なのですが、

nvenc 用のイメージ作成部分を削除 (#535, #539, #549) を手動で revert し、

は、revertするというよりこのリポジトリのDockerfile.ubuntu-nvenc自体を削除してしまったほうがいいと思います。というのも、ffmpeg部分を含まないのであれば、debian版と差別化できる部分がなく必要性がないと考えるからです。

そして、docker-mirakurun-epgstation側に作成するDockerfileでは

  1. ubuntu+cuda(dev)のイメージの上でffmpegのビルドをして、ファイルだけ抽出
  2. l3tnun/epgstation:master-debianから、/appだけ抽出
    その後、ubuntu+cuda(runtime)をとってきてその上に
  3. node.jsをセットアップ
  4. ffmpegが使うランタイムライブラリをインストール
  5. その上に1,2を展開
    という処理を置くのが良いと思います。

以上ご意見ありましたらコメントお願いします。

@kazuki0824
Copy link
Contributor

@l3tnun また、こちらのリポジトリからはdocker.ioにイメージを発行していると思うのですが、これについてはどうしましょうか。
私見ですが、アクセラレーションの効いた環境で録画サーバを構築する需要というのは一定数存在すると考えています(現にdocker.ioにて非公式のイメージが乱立しています)。そのため「cuda-enabledな環境にEPGStationとffmpeg」というDockerイメージをどこかしらで公式に作っておいたほうがいいのでは?と思っています。

@l3tnun
Copy link
Owner

l3tnun commented Oct 24, 2021

@kazuki0824
Dockerfile.ubuntu-nvenc OK です。検証に時間も必要だと思うので、来週目処に作業しようと思います。

また、こちらのリポジトリからはdocker.ioにイメージを発行していると思うのですが、これについてはどうしましょうか。

私としては ffmpeg については環境に応じてバージョンを変えたり、パッチを当てたりするものと思っているので、公式で提供してもあまり効果的ではないかなあと考えています。
ですので、公式にイメージ提供は積極的にする気はないです。

@kazuki0824
Copy link
Contributor

私としては ffmpegについては環境に応じてバージョンを変えたり、パッチを当てたりするものと思っているので、公式で提供してもあまり効果的ではないかなあと考えています。

確かにそのとおりですね。承知しました!

@kazuki0824
Copy link
Contributor

kazuki0824 commented Oct 25, 2021

1つ提案なのですが、
私は長い間貴殿のソフトウェアの恩恵にあずかっていて、今後もアクセラレーションの効いた環境をメンテするモチベーションがあります。
そこで、①GPUを有効化したffmpegを載せ②トランスコードにGPUを使うよう設定したバージョンを、リファレンス構成の一例として私の方でメンテナンスしましょうか。
そのリポジトリに対し例えばReadmeなどからリンクを張ってもらうことで、いわば半標準の構成とするというものです

運用については細部を検討しないといけないかもしれませんが、貴殿の負担が軽減されるという点では悪い話ではないのではと考えています。

@l3tnun
Copy link
Owner

l3tnun commented Oct 25, 2021

なるほど、良い考えだと思います。
その運用方法であれば私は特に問題ないです。

@kazuki0824
Copy link
Contributor

@5ym
Copy link
Contributor Author

5ym commented Oct 28, 2021

@kazuki0824
dockerfileだけ配置してgithub packagesにイメージ登録したらどうですかそうすれば本家のdokcer-epgstation-mirakurunからカンタンに使えます

@kazuki0824
Copy link
Contributor

@5ym composeが本家と共通ではないので、Dockerfileだけ配置するのは考えていません。
Packagesにイメージ登録するのは一回やってみようと思います

@5ym
Copy link
Contributor Author

5ym commented Oct 28, 2021

@kazuki0824
それ前提で本家はdocker-compose.ymlをignoreしています

@kazuki0824
Copy link
Contributor

@5ym 良く分かっていないのですが、本家のリポジトリに差分を重ねる形で使えるように整えればいいのでは?という趣旨でよろしいでしょうか。

今回は

  • 設定ファイルをnvenc用にカスタムしているので、重ね合わせだと上書きが発生してあまりイケてない
  • 元をただせば、本家のメンテナンスの負担軽減のためにこちらで肩代わりしてメンテをする話になっている
    という意図があるので、今のように本家と構成は概ね同じだけど中身はカスタムされた物を作ってあくまで別物として対処する予定です

@5ym
Copy link
Contributor Author

5ym commented Oct 29, 2021

すみません補足不足でした
そうすると本家の追従に二度手間になるので差分のファイルのみを配置して本家のファイルを置き換えるスクリプトにしたらどうですかどちらかが更新されなかった時点で整合が取れなくなりそうなので

@5ym
Copy link
Contributor Author

5ym commented Oct 29, 2021

本家に構築用のワンライナーがあるのでその設定ファイルをコピーする部分を作成していただいたリポジトリから取得するようにすれば構築が簡素で本家更新時に利用者が困らずにできると思います

@kazuki0824
Copy link
Contributor

要するに https://github.com/l3tnun/docker-mirakurun-epgstation/blob/v2/setup.sh を多少モディファイしたものを私のリポジトリにも配置してインストール手順を統一しよう、ということでしょうか。既存ユーザーから見てもわかりやすい形となりますし、素晴らしい案だと思います。
(本来はEPGStation+ffmpegのコンテナセットアップだけやるつもりで、3点セットまでサポートする気はなかったのですが、、、ここまできたらやってしまいましょう。笑)

どういう形にするかは私の方でも少し検討させてください。固まり次第ここでも共有しますね。
以上、よろしくお願いします。

@l3tnun
Copy link
Owner

l3tnun commented Oct 30, 2021

@kazuki0824
EPGStation-nvenc-docker の作成ありがとうございます。
readme に反映させていただきました。

kazuki0824 added a commit to kazuki0824/EPGStation-nvenc-docker that referenced this issue Nov 2, 2021
@kazuki0824
Copy link
Contributor

とりあえず、それっぽい形になってきたので共有しておきます。

コンテナ単体をビルドするsingle-container.shとcomposeを使った環境を整えるsetup.shを用意しました。
single-container.shは特に込み入った処理を行いませんが、
setup.shでは内部的にdocker-mirakurun-epgstationをとってきて中身をコピーする処理が行われます。
https://github.com/kazuki0824/EPGStation-nvenc-docker

@5ym 5ym closed this as completed Jan 4, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants