はじめに
この記事では、Docker のバインドマウント機能を利用して、ホストマシンのファイルを Ruby コンテナで実行する手順について記載します。
バインドマウントへの理解促進の一環で行っています。
バインドマウントとボリューム
バインドマウントと似た概念として、ボリュームがあります。
両者ともデータをコンテナとは別に管理するという役割を持っていますが、データの保存先が異なります。
- バインドマウント : ホストマシンのファイルやディレクトリ
- ユースケース : ホストマシンのエディタでファイルを編集して、コンテナで実行する
- ボリューム : ホストマシンの Docker のストレージ
- ユースケース : データベースサーバーのデータを保持する
ボリュームについては、こちらの記事に記載しています。
開発環境
開発環境は以下の通りです。
- Windows 11
- Docker Engine 26.1.1
- Ruby 3.3.3
コンテナにバインドマウントする
まず、コンテナにバインドマウントするためのデータとして、ホストマシンに Ruby ファイルを追加します。
puts "Hello world from host machine"
次にボリュームと同じくdocker container run
コマンドの --mount
オプションを指定して、作成した Ruby ファイルをマウントします。
<key> | <value> | 備考 |
---|---|---|
type | bind | |
source | "$(pwd)" |
pwd コマンドで作業ディレクトリの絶対パスを展開 |
target | /my-work | 任意のパス |
それでは、Ruby ファイルを作成したディレクトリで、Ruby コンテナを起動します。
# docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker container run `
--name ruby `
--rm `
--interactive `
--tty `
--mount type=bind,source="$(pwd)",target=/my-work `
ruby:3.3.3 `
bash
コンテナ内でファイル操作をしたいため、[COMMAND]
に bash
を指定しています。それに伴いコンテナを対話操作するため [OPTIONS]
に --interactive
と --tty
を指定しています。
プロンプトが変わります。
destibation
(マウント先)として指定したパスに Ruby ファイルが存在するか確認します。
ls /my-work/
Ruby ファイルの内容を出力します。
ruby /my-work/hello.rb
ホストマシンで Ruby ファイルの内容を変更して、再度 Ruby ファイルの内容を出力します。
puts "Hello world!"
ruby /my-work/hello.rb
コンテナで Ruby ファイルを削除すると、ホストマシンからもファイルがなくなるので、注意が必要です。
rm /my-work/hello.rb
参考
関連記事