こんにちは、にしむらです。
今回はコンテナとファイルを共有する方法についてです。
前回のSinatraのサンプルですと、ソースコードを修正するたびにコンテナをビルドする必要がありました。 今回はホストのディレクトリをコンテナにマウントすることで、コンテナ起動中でもファイル変更が反映されるようにしていきたいと思います。
動作環境
- OS macOS 10.15.7
- docker desktop community 3.0.1
使用するファイル
使用するファイルは前回と同じですが、sample.rbはappディレクトリに移動させてください。
. ├── Dockerfile └── app └── sample.rb
Dockerfile
FROM ruby:2.7.2-alpine # gem install # → sinatra-contribを追加 RUN gem install sinatra sinatra-contrib # 作業ディレクトリ指定(存在しない場合は作成) # → 以降のコマンドは指定ディレクトリで実行される。 WORKDIR /sinatra_app # 開放するポート番号 EXPOSE 4567 # docker runされた時に実行されるコマンド CMD ["ruby", "sample.rb"]
前回との差分
sample.rb
のコピーを削除gem sinatra-contrib
を追加WORKDIR /sinatra_app
を追加
./app/sample.rb
require 'sinatra' require 'sinatra/reloader' set :bind, '0.0.0.0' get '/' do 'Hello docker!!' end
前回との差分
require 'sinatra/reloader'
を追加
手順
1.Dockerイメージを作成する
コマンド docker build -t sinatra_sample2 .
を実行
解説
今回はsinatra_sample2
として新しいイメージを作成します。
結果
[+] Building 0.9s (7/7) FINISHED => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 37B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/ruby:2.7.2-alpine 0.8s => [1/3] FROM docker.io/library/ruby:2.7.2-alpine@sha256:72a83c3b7e2d1a5b6e3cd9b61c9e82ec843cbd9226ca80ff7ef02df28e84ea09 0.0s => CACHED [2/3] RUN gem install sinatra sinatra-contrib 0.0s => CACHED [3/3] WORKDIR /sinatra_app 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:057a0f837d7218a710f58cc368ff6f11ae314cfbc96b9b69e3eee7e26be65877 0.0s => => naming to docker.io/library/sinatra_sample2
確認
コマンド docker images
を入力してREPOSITORY
にsinatra_sample2
があることで確認できます。
REPOSITORY TAG IMAGE ID CREATED SIZE sinatra_sample2 latest 057a0f837d72 37 minutes ago 54.5MB
2.コンテナの作成と実行
前回のsinatra
コンテナが動作中であれば停止させておいてください。
docker stop sinatra
作成と実行
docker run -d -p 8000:4567 --name sinatra2 -v $PWD/app:/sinatra_app sinatra_sample2
解説
前回のとの差分
コンテナ名とイメージ名をそれぞれ
sinatra2
sinatra_sample2
変更ボリュームオプション
-v $PWD/app:/sinatra_app
を追加
-v
フラグはホストのディレクトリをコンテナ内にマウントします。-v [ホスト側パス]:[コンテナ側パス]
これで、ホストのapp
ディレクトリをコンテナ内のsinatra_app
にマウント(共有)されます。
結果
成功なら作成したコンテナIDが表示されます。IDは実行ごとに異なります。
0f7de30f843871276e2a2a6696f73efe853505df297f91387b0221c1e06fa2c5
確認
コマンド docker ps
を入力してコンテナが稼働していることを確認します。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0f7de30f8438 sinatra_sample2 "ruby sample.rb" 33 seconds ago Up 32 seconds 0.0.0.0:8000->4567/tcp sinatra2
3.ブラウザで確認
ブラウザで、URLhttp://localhost:8000
と入力して、「Hello docker!!」と表示されていればSinatra
が正常に稼働しています。
さらに、sample.rb
を編集して、変更内容がブラウザで反映されるか確認しましょう。
sample.rb
7行目の'Hello docker!!'
を'こんにちは docker!!'
に変更- ブラウザをリロード
- こんにちは docker!!と表示されいれば成功です。
これで、コンテナを稼働させながらファイルの編集ができます。