Dockerランコマンドを簡単にする方法


私は最近、ビデオからアニメーションGIFを作成したい.アイデアは非常に軽量なファイルで、ビデオのプレビューを取得することでした.クイック検索の後、私はFFMPEG , メディアを操作する素晴らしいマルチメディアフレームワーク.また、別の言語に存在するラッパーもあります(例:C CHERHUNE、JavaScript)ですが、それでも局所的にffmpegをインストールする必要があります.実際、私は雲の中で何かインストールを必要としない単純な解決を望みました.このポストでは、どのように私は最初の1つを達成共有したい.

The code and container image are available on GitHub and Docker Hub.


ファーストコンタクト


FFMpegフレームワークは非常に強力であり、多くのことを行うことができますしたがって、それは可能なパラメータと拡張子のトンを持って正常です.ドキュメントといくつかの試行錯誤に費やされた時間の後、私はこの方法で呼ぶ必要があるものを正確に行う方法を見つけました.
ffmpeg -r 60 -i $INPUTFILE -loop 0 -vf scale=320:-1 -c:v gif -f gif -ss 00:00:00.500 -r 10 -t 5 - > $OUTPUTFILE
これはビデオから5番目のアニメーションGIFを作成します.それはビデオをスピードアップし、出力を軽量に保つためにGIFのフレームレートを下げます.以下が例です.

これは素晴らしいですが、これは非常に友好的ではありません.一度だけビデオを作成する人は、すべてのこれらのパラメータを覚えていると予想されるか?さらに困難なときには、ビデオが垂直にいくつかのパラメータには異なる値があります.簡単にする時間でした、そして、ここで、私はそれをしました.私がDocker初心者であることに注意してください、そして、あなたが若干のステップをするより単純であるかより良い方法があると思うならば、知らせてください、そして、一緒に学びましょう.

計画


単純なDockerコマンドを実行しますdocker run fboucher/aciffmpeg -i NotInTheSky.mp4 ビデオプレビューを生成します.我々の一時的なコンテナを構築するために、我々は以下のような軽量で始めますalpine , ffmpegをインストールし、コンテナとして実行されるスクリプトを追加します.それは素晴らしい計画のように聞こえる、それをしましょう!

スクリプトを書く


スクリプトは簡単ですが、私はそれを書くいくつかのことを学んだ.これがこのポストに含まれている理由です.目標は単純です:パラメータからいくつかの値を使用してffmpegコマンドを実行します.スクリプトはこちら
#!/bin/sh

while getopts ":i:v" opt; do
  case $opt in
    i) inputFile="$OPTARG"
    ;;
    v) isVertical=true
    ;;
    \?) echo "Invalid option -$OPTARG" >&2
    exit 1
    ;;
  esac

  case $OPTARG in
    -*) echo "Option $opt needs a valid argument"
    exit 1
    ;;
  esac
done

if [ -z "$isVertical" ]; then isVertical=false; fi

# used for bash 
#IFS='.'
#read -a filePart <<< "$inputFile"
#outputFile="${filePart[0]}.gif"

# used for dash 
filename=$(echo "$inputFile" | cut -d "." -f 1)
outputFile="$filename.gif"

if $isVertical
then
  ffmpeg -r 60 -i $inputFile -loop 0 -vf scale=-1:320 -c:v gif -f gif -ss 00:00:00.500 -r 10 -t 5 - > $outputFile
else
  ffmpeg -r 60 -i $inputFile -loop 0 -vf scale=320:-1 -c:v gif -f gif -ss 00:00:00.500 -r 10 -t 5 - > $outputFile
fi

私が学んだこと:値のないパラメータ


スクリプトはできるだけフレンドリーなので、不要な情報を削除する必要があります.ほとんどの動画は水平になりますので、パラメータを省略しましょう.しかし、ユーザーに値を指定する必要はありませんscript.sh -i myvideo.mp4 -v true 代わりにscript.sh -i myvideo.mp4 -v . これは非常に簡単です、一度それを知っている.パラメータを取得する際のコードの最初の行では、getopts ":i:v" "V "の後に":"がないことに注意してください.これは任意の値を期待していないことを指定します.

私が学んだこと:bashとダッシュ


前述のように、コンテナはアルプスから造られるでしょう.そして、アルパインにはbashがありませんが、代わりにダッシュとしてダッシュを使用します.それはほとんど同じですが、いくつかの違いがあります.最初の1つはShebang(別名“第1行)”.そして二つ目は文字列操作でした.同じ名前でスクリプトの異なる拡張子を持つ新しいファイルを生成するには、ファイル名を"."に分割します.これはできますIFS ... read... <<< bashのコマンド(スクリプトでコメントします)syntax error: unexpected redirection そして、これはないからです<<< bashで.代わりに、コマンドを使用する必要がありますcut -d "." -f 1 (ここで- dはデリミタとして使用するcharを指定します.

イメージのビルド


今すぐDockerFileのすべてのドットを接続する時間です.
FROM alpine:3.13
LABEL Name=aciffmpeg Version=0.0.2
RUN apk add ffmpeg
COPY ./src/myscript.sh /
RUN chmod +x /myscript.sh
ENTRYPOINT ["/myscript.sh"]
ファイルは非常に複雑ではありませんが、行単位で行を渡しましょう.
  • スタートFROM アルパインバージョン3.13LABEL .
  • RUN ffmpegをインストールするコマンドを実行します.The apk アルプスのデフォルトのユーティリティは、アプリをインストールするようにapt Ubuntuで.
  • COPY ローカルマシンからスクリプトをルートのコンテナにコピーします.
  • 二番目RUN コマンドはスクリプトが実行可能であることを確認することです.
  • 最後にENTRYPOINT この場合、実行可能ファイルとして実行するコンテナをスクリプトとして設定できます.Dockerに渡されたすべてのパラメータは、スクリプトに渡されます.
  • 今残っている唯一のことは、ビルド、タグ、およびDockerハブにプッシュすることです.
    docker build -t fboucher/aciffmpeg .
    
    docker tag  0f42a672d000 fboucher/aciffmpeg:2.0
    
    docker push fboucher/aciffmpeg:2.0
    

    簡易版


    そして今、あなただけのボリュームをマップし、ファイルのパスを指定する必要があります任意のビデオのプレビューを作成するには、ビデオが垂直であるかどうか言及.
    Linux/WSLでは以下のようになります.
    docker run -v /mnt/c/dev/test:/video fboucher/aciffmpeg -i /video/sample.mp4 -v
    
    そしてそのようなパワーシェルでは:
    docker run -v c/dev/test:/video fboucher/aciffmpeg -i /video/sample.mp4 -v
    
    私はそのプロジェクトをやっているドッカーについてたくさん学びました.あなたの人生や仕事を簡素化するコンテナを使用して構築されたツールは何ですか?

    ビデオバージョン


    あなたが興味があるならば、私はビデオ版を録画しました.
    フランク