Docker のコマンドオプションは多彩な上に Docker 関連のコマンドラインツールが多く、色々なことができます。いくつかのオプション等の定型の組み合わせのうち、自分がよく使う便利なものをいくつかこの記事で紹介します。
次のコマンドでは docker run 実行時に run 中のコンテナ内のファイルとディレクトリをホスト側と同じ感覚で扱えるようになるコマンドです。これを使うと run するイメージの内部のことを気にせずに動作させられます。
docker run -v $(pwd):$(pwd) -w $(pwd) ラン対象のコマンド # 例 docker run -v $(pwd):$(pwd) -w $(pwd) ffmpeg -i input.mkv -map 0:v:0 -c copy -f null -
何が起きているかというと自分が今いるディレクトリとそのディレクトリ以下の状態を Docker コンテナ内にマウントさせ、そのマウントしたディレクトリを Docker コンテナ中におけるカレントディレクトリ的に扱っています。このため ffmpeg をはじめとしたファイルを対象にあれやこれやするコマンドラインツール的なイメージをホストマシン同様の感覚で手軽に扱えます。
docker コマンドとは少し違いますが、次も便利です。DockerHub の API を叩いてタグの一覧を持ってこれます。 jq コマンドをあらかじめインストールしておく必要があります。
jq jq は JSON をコマンドライン上で取り扱うのに便利なコマンドです。
curl -s https://registry.hub.docker.com/v1/repositories/イメージ名/tags | jq -r '.[].name' # 例 curl -s https://registry.hub.docker.com/v1/repositories/php/tags | jq -r '.[].name' | grep apache | grep 7.4 7.4-apache 7.4-apache-buster 7.4-rc-apache 7.4-rc-apache-buster 7.4-rc-apache-stretch 7.4.0-apache 7.4.0-apache-buster 7.4.0RC1-apache 7.4.0RC1-apache-buster # 以下 7.4 と apache の PHP タグが続きます
Docker Hub
Docker Hub でイメージを見つけるのは簡単ですが適したタグを見つけるのは案外難しいです。名前から内容が推測できる様にタグが整理されている場合、このコマンドは本当に便利です。
次のコマンドは今動いているコンテナの中のファイルやディレクトリを外部に吐き出させたい時に使います。
docker cp $(docker-compose -q ps コンテナ名):イメージ内の外部吐き出したいディレクトリのパス ホスト側の出力先パス # 例 docker cp $(docker-compose -q ps mysql):/var/lib/mysql ./db # docker-compose.yml 内で mysql: と定義されたコンテナの中の MySQL のログを ./db 以下に出力
改めてボリュームをマウントしなおして再起動といったことがしていられない時によく使います。また、これに限らず$(docker-compose -q ps mysql)
で稼働中の docker-compose.yml で定義したコンテナのコンテナIDを取得してなんやかんやするのは便利です。
次のコマンドは docker run した後の exit したコンテナの掃除に便利です。
docker ps -aq -f status=exited -f ancestor=ラン元のイメージ名 | xargs -r docker rm # docker rm $(docker ps -aq -f status=exited -f ancestor=ラン元のイメージ名) でも同じ結果です # 例 docker ps -aq -f status=exited -f ancestor=my_ffmpeg | xargs -r docker rm
とある案件で高頻度で docker run する必要があり、その際に教えてもらったコマンドです。docker-compose, docker 問わず ps でコンテナを探して、-f 等でなんやかんや探して -q でコンテナIDだけ引っ張ってきて、次の docker コマンドに渡す、というのは Docker が想定している使い方の様でスマートな印象です。頑張って awk する様なハックの必要がありません。