個人的なメモ

技術メモがメインです.本ブログはあくまで趣味です.

VScodeで数式を書いてpdf化する

インストールするもの

  • 数式を入力のための拡張

Markdown+Math

もしくは

Markdown All in One

テンプレ書き換え

> Extensions: Open Extensions Folder 

拡張機能フォルダを開いて書き換える。

markdown-pdf.../template/template.html

<!DOCTYPE html>
<html>
<head>
<title>{{{title}}}</title>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
{{{style}}}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.css" integrity="sha384-9eLZqc9ds8eNjO3TmqPeYcDj8n+Qfa4nuSiGYa6DjLNcv9BtN69ZIulL9+8CqC9Y" crossorigin="anonymous">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/katex.min.js" integrity="sha384-K3vbOmF2BtaVai+Qk37uypf7VrgBubhQreNQe9aGsz9lB63dIFiQVlJbr92dw2Lx" crossorigin="anonymous"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/contrib/auto-render.min.js" integrity="sha384-kmZOZB5ObwgQnS/DuDg6TScgOiWWBiVt0plIRkZCmE6rDZGrEOQeHM5PcHi+nyqe" crossorigin="anonymous"></script>
<script>
  document.addEventListener("DOMContentLoaded", () => {
    renderMathInElement(document.body, {
      delimiters: [
        { left: "$$", right: "$$", display: true },
        { left: "$", right: "$", display: false },
      ]
    });
  });
</script>
</head>
<body>
{{{content}}}
</body>
</html>

Mathjaxの有効化は下記のようにする.

  <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
    <script type="text/x-mathjax-config">
        MathJax.Hub.Config({ tex2jax: {inlineMath: [['$', '$']]}, messageStyle: "none" });
    </script>

qiita.com

qiita.com

PyTorchによるディープラーニング

PyTorchによるディープラーニング

ディープラーニングの勉強に関するメモです. 使用しているのはこの本.

https://honto.jp/netstore/pd-book_29719626.html

第二章 物体検出(SSD)

SSD(Single shot multibox detector)の内容.

物体検出タスクのアウトプット 1.画像のどこに物体が存在するのかを示すバウンディングボックスの位置と大きさ情報 2.書くバウンディングボックスが何の物体であるのかを示すラベル 3.その検出に対する信頼度

SSDによる物体検出のステップ 1.画像を300×300にリサイズ 2.デフォルトボックス8732個を用意 3.画像をSSDのネットワークに入力 4.信頼度上位のデフォルトボックスを抽出 5.オフセット情報による修正と被りの除去 6.一定の信頼度以上のものを出力

最初はVGGだが,途中から畳み込む回数が異なる複数の特徴マップを作る.その特徴マップにおいてサイズそれぞれことなるので,空間的に大きな特徴と小さい特徴を分けて抽出できる.

  • 実装

PytorchのModuleListを使って各モジュールを定義すると実装上分かりやすい.

Maxpooling層については,'MC'はceilモードのMaxpooingになる.Maxpooling層は出力テンソルのサイズを計算する際,デフォルトではfloorモード(床関数モード)となっており,整数のテンソルサイズを求める際に小数点を切り捨てるが,cailモード(天井関数モード)にすると小数点切り上げになる.

ReLUの引数inplaceは,ReLUへの入力をメモリ上に保持するか,それとも入力を書き換えて出力にしてしまい,メモリ上に入力を保持しないかを示す.変数inplaceをTrueにするとメモリを書き換えるため,メモリ上に入力を保持しない設定となり,メモリを節約できる.

L2Norm層は,チャネルごとに特徴量マップの統計的性質が異なる点を正規化する. チャンネル方向に正規化をすることで,チャネルごとに特徴量の大きさが著しく異なる状況を修正することができる.

DBox(デフォルトボックス)の種類は 4 種類の設定の場合は,小さい正方形,大きい正方形,1:2の比率の長方形, 2:1の比率の長方形. 6種類の場合はさらに,3:1と1:3の比率の長方形の形のDBoxを用意する.

Non-Maximum Suppressionにより,冗長なBBoxを削除し,1つの物体に対して1つのBBおxのみを残す. 具体的には,BBox同士のかぶっている面積がしきい値を超える場合には,同じ物体への冗長なBBoxと判定する.

SSDの損失関数を定義するにあたり,まず8732個のDBoxから学習データの画像の正解BB0xと近いDBoxを抽出する. 抽出する際はjaccard係数を使用する. jaccard係数は2つのBoxの総面積( BBox ∪ DBox )に対するBBoxとDBox が被っている部分の面積(BBox ∩ SBox )の割合である. jaccard係数は0~1の値をとり,2つのBoxが完全に一致していればjaccard係数は1になり,完全にはずれていると0となる.

jaccard係数が0.5以上となる正解BBoxを持たないDBoxの場合は,そのDBoxをNegative DBoxとし,そのDBoxの予測結果の教師データとなる正解物体のラベルを0とする.

Pytrochの勉強

ディープラーニングの勉強に関するメモです. 使用しているのはこの本.

honto.jp

第一章 画像分類と転移学習(VGG)

理論・テクニック

転移学習(Transfer learning):学習済みモデルをベースに,最終の出力層を付け替えて学習させる.自前のデータが少量でも性能が出るネットワークを実現しやすい.

ファインチューニング(Fine tuning):入力層に近い層の結合パラメータも学習済の値から更新させる. 入力層に近い部分のパラメータは学習率を小さく設定し,出力層に近い部分のパラメータは学習率 大きく設定するのが一般的.

訓練時にはデータオーギュメンテーションを実施する.データに対してepochごとに異なる画像変換を適用し,データを水増しする. 画像変換の例として,リサイズ,アスペクト比の変更,回転などがある. これらの処理をランダムで行う.

実装

PyTorchでディープラーニングの計算結果を完全に再現できるように設定したい場合に、GPUを使用するケースでは別途以下の設定が必要. これをやると速度が遅くなる.

torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False

https://pytorch.org/docs/stable/notes/randomness.html

github.com

画像分類タスクのデータセットを作成する場合,torchvision.datasets.ImageFolderを使用するのが簡単. PyTorchのDatasetクラスを継承して書き換えるのも良い.

データオーグメンテーションにはtransformsを使う.

Pythonイテレータを使って処理を繰り返すのが便利.

hhttps://python.ms/iterator/#_1-%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF%E3%82%92%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82

学習の際,requires_grad = True と設定したパラメータは誤差逆伝搬で勾配が計算され,学習時に値が変化する. 一方で,requires_grad = False と設定したパラメータは学習時に値が変化しない. パラメータは,models.named_parametersに格納されている.

pytorch.org

Pytorchでは,イテレーションごとのネットワークのforwardおよびlossの計算方法がある程度一定であれば,torch.backends.cudnn.benchmark = Trueと設定することでGPUの計算が高速化される.

Physically based rendering(PBR)を理解するための基礎知識

Physically based rendering(PBR)を理解するための基礎知識

PBRとは,物体における光の反射や拡散,光源,シーン,カメラに入射する光などを数式でモデル化してレンダリングする手法. ここでは,他の記事を参考に光の基礎からまとめていきます.

 光の二面性

光は粒子の二面性を持つ.

波として捉える場合は,光は電磁波の一種と考える. 電磁波は電場と地場の変化によって作られる波であり,光のエネルギーを放出または伝達する. この現象を放射と呼ぶ. 真空中を電場と磁場が垂直に絡まり合いながら進行していくものが光である. 電場または磁場の山から山の長さが波長となる. 太陽や電球などの光源から電磁波が発生し,大気中で散乱や吸収されながら進み,物体表面にぶつかって反射が起こる. 光は媒質によって伝搬される.媒質となる物体を媒体と呼ぶ.

f:id:engineerAlex:20200607125631p:plain

光は粒子としての側面も持つ.粒子的な側面を強調すると,光を光子と呼ぶ. 金属に光を当てた時に,金属の表面から電子が飛び出す.この現象を光電効果と呼ぶ. 飛び出した電子を光電子と呼ぶ. 強い光を金属に当てても電子は飛び出さないが,波長の短い光を当てると電子が飛び出す. 当てる光の波長を短くすると,飛び出す電子の数は変わらず,電子のエネルギーが大きくなる. 光を強くしていくと,飛び出す電子の数が増え,電子のエネルギーは変化しない.

この現象は,光を波動として捉えると説明ができず,光を粒子として捉えることで説明できる. つまり,光が粒子として金属に当たり,電子がはじき出されると考えるということである. なお,光電子増倍管は,光電効果を利用して光を検出する.

f:id:engineerAlex:20200607125706p:plain

光の性質

  • 直進性 光を電磁波の一種と捉えると,障害物がなく均一な物体の中を通る限りは直進する. 光の速度は299792458[m/s]である.

  • 反射性 光は金属などの表面で鏡面反射する. この時,反射の法則により完全に平坦な表面上においては,入ってきた光と反射する光の角度が等しくなる(完全反射). 表面に凹凸がある場合は様々な方向に反射される(乱反射).

  • 屈折性 光は通り抜ける物体によって速度が変わる. そのため,密度の違う物質の協会では屈折する.

  • 吸収性 物質には特定の波長の光を吸収する性質がある. 光が吸収されると多くの場合,そのエネルギーは熱に変わる. 変化した量に応じて光の強さは減衰し,光の色はその波長に応じて吸収された光量だけ変化するが,光線の方向は変わらない.

吸収と散乱

吸収とは,光が微小の粒子にぶつかった時に,直進する方向を変えることである. 方向は媒体の材質に応じて変化する.

吸収とは光のエネルギーが物質との相互作用によって,他のエネルギーに変わることである.

光のエネルギー

光のもつ物理的なエネルギーは光学において放射量と呼ぶ.

人間は光の波長に応じて感度が異なり,波長のち外は色として知覚される. 人間の眼を通した光の量を測光量といい,測光学(Photometry)の扱いになる.

光線

光線がある表面に当たると,以下のいずれかもしくは両方が発生する.

反射:光線が表面で反射し,異なる方向へ進行する.反射の法則に従えば反射角は入射角に等しくなる.

屈折:光線は表面で速度が代わり,屈折して一方の媒体から別の媒体へと通り抜ける.

反射

入射光と反射光の関係は下記の通り.

f:id:engineerAlex:20200607125729p:plain

鏡面反射

物体表面における反射光を鏡面反射光と呼ぶ. 凹凸のない表面にぶつかると,入射角と反射角は同じになる. 一般的な物体は多少凹凸があるため,反射光は鏡面反射方向に拡散し,反射した光はぼやけて見える. 一方,物体表面が滑らかな場合は収束し,反射した光は鮮明になる.

f:id:engineerAlex:20200607125745p:plain

屈折

光線は表面で速度が代わり,屈折して一方の媒体から別の媒体へと通り抜ける. この際の速度変化の指標が屈折率(Index of refraction:IOR)である. 屈折率の定義は下記の通りである.


n = \dfrac{c}{v} = \sqrt{\dfrac{\epsilon \mu} {\epsilon_0 \mu_0}}

ここで,\mu\epsilonはそれぞれ材質の透磁率[H/m]と誘電率[F/m]である. \mu_0\epsilon_0はそれぞれ真空の透磁率誘電率である.

下記が光の屈折の例.ストローが曲がって見える.

f:id:engineerAlex:20200607125758p:plain

拡散反射光

光線が別の媒体に入り,その媒体内部で散乱や吸収を起こし,元の媒体に出射される光を拡散反射光と呼ぶ.

f:id:engineerAlex:20200607132843p:plain

微小面

光線が物体表面にぶつかって反射する方向は,物体表面の凹凸に依存する. 小さな凹凸を微笑面(microfacet)と呼び,微小面の傾きから物体表面の粗さを計算する. 各微小面は完全鏡面反射すると考えることがある. この考え方では,微小面により光が物体表面に到達する直前や,反射直後に近傍の打ったい表面により遮られる現象が起きる. この現象をローカルオクリュージョンと呼び,ローカルオクリュージョンはセルフシャドウイングと背フルマスキングがある. セルフシャドウイングは光が物体表面に到達するまでの間に物体表面によって遮られる現象である. セルフマスキングは光が物体表面で反射された後に物体表面から遠ざかる間に遮られる現象である.

f:id:engineerAlex:20200607132856p:plain

物体表面に凹凸があるということは,微正面の傾きに変化があるということで,これにより光が拡散する.

f:id:engineerAlex:20200607132910p:plain

放射束

光の基本単位は光子(photon). 放射エネルギー(radiant energy){Q} は,光子が集まったエネルギー. このエネルギーを単位時間あたりで表したものを放射束(Flux)といいます.{\phi}で表記する.

{
\Phi = \frac{\Delta Q}{\Delta d} = \frac{dQ}{dt}
}

放射照度(Irradiacne)

放射照度{E}は単位面積あたりの放射束. ある面積{A}に到達する放射束を{\Phi}とすると,放射照度{E}は次のようになる.

{
E = \frac{\Phi}{A}
}

ある位置 x に入ってくる放射照度は次のようになる.

{
E(x) = \frac{d \Phi}{dA}
}

立体角

立体角(solid angle)は,方向と光線の角度的な「大きさ」を表す. 立体角の単位はステラジアン(sr). 立体角は平面角を3次元に拡張したものと考えることができ,面角{\theta}は,円上に張られた弧の長さ{l}を円の半径 {r}で割ったもの.

{
\theta = \frac{l}{r}
}

これを3次元で考えると,半径{r}の球面上の面積{A}に対応する立体角{\omega}は[tex:{\omega = A/r2}]. 球の面積は[tex:{4\pir2}]のため,球全体の立体角は{4\pi}ステラジアンになる.

放射強度

放射強度(radiant intensity){I}は,単位立体角({\omega})あたりの放射束.

{
I(\vec{\omega}) = \frac{d \Phi}{d \vec{\omega}}
}

放射強度は一定の方向に,どの程度の放射束が放出されているのかを表す.

放射輝度

放射輝度(radiance){L}は,単位立体角あたり,単位投影面積あたりの放射束. 単位投影面積{\cos\theta dA}は,光が進む方向に直交する面へ単位面積を投影したもので,放射輝度はこの単位投影面積で放射強度を割った値.

{
L(x,\vec{\omega}) = \frac{d^2 \Phi}{\cos \theta dA d \vec{\omega}}
}

物体表面における入射してくる放射輝度がわかっていれば,半球面上のすべての方向 {\Omega}と物体表面の領域{A}積分することにより,放射束を計算することができる.

{
\Phi = \int_{A} \int_{\Omega} L(x,\vec{\omega}')(\vec{\omega}' \cdot \vec{n}) d \vec{\omega}' dx
}

放射照度と放射輝度の関係

ある領域{A}を通過する放射束{\Phi}があるとすると,ある領域の放射照度{E}{\Phi/A}となる. また同じ位置で,同じ放射束が通過する{\vec{\omega}}方向と直交する面の領域を考えると,この領域の面積{A_{\omega}}{A\cos\theta}となる. これはランバートのコサイン則として知られている. よって,この領域における放射照度は次のようになる.

{
E_{\vec{\omega}} = \frac{\Phi}{A_{\vec{\omega}}} = \frac{\Phi}{A \cos\theta}
}

これに放射照度の関係を入れると次のようになる.

{
E = E_{\vec{\omega}} \cos\theta
}

点xにおける放射照度は,半球面上のあらゆる方向から入射した放射輝度を足し合わせたものと考えられる. 放射照度と放射輝度との関係により,放射輝度に入射角の余弦{\cos\theta})を掛けることで放射照度に変換することができる. 入射角の余弦は,法線ベクトルと入射方向の単位ベクトルとの内積{\vec{\omega}' \cdot \vec{n}}で求められ,一般的にコサイン項と呼ばれる. これらをまとめると次のようになる.

{
E(x) = \int_{\Omega} L_{i}(x,\vec{\omega}') (\vec{\omega}' \cdot \vec{n}) d\vec{\omega}'
}

双方向反射率分布関数

BSSRDFでは入射する位置と出射する位置を別々に考えた関数. ここで入射する位置と出射する位置が同じだと想定して,BSSRDFを単純化したのが双方向反射率分布関数(bidirectional reflectance distribution function:BRDF).

BRDF{f_{r}}は,反射される放射輝度と放射照度の関係を以下のように定義する.

{
f_{r}(x,\vec{\omega}',\vec{\omega}) = \frac{dL_{r}(x,\vec{\omega})}{dE_{i}(x,\vec{\omega}')} = \frac{dL_{r}(x,\vec{\omega})}{L_{i}(x,\vec{\omega}')(\vec{\omega}' \cdot \vec{n}) d \vec{\omega}'}
}

BRDFは,点{x}{\vec{\omega}'} 方向から入射した光のどれだけが,{\vec{\omega}}方向に反射されるかを表す割合. 一般的に反射の特徴は,「物体表面の材質」と「光の当たり方」の2つで決まってきます.「物体表面の材質」の部分は BRDF,「光の当たり方」の部分はコサイン項で定義する.

反射率

反射率の定義は,物体表面に入射する放射束と反射される放射束の比で表す. 反射率は0~1の値になる.

{
\rho(x) = \dfrac{d\phi_r(x)}{d\phi_i(x)}
}

BSDFから反射率を表す方法は下記ページを参照.

rayspace.xyz

引用/参考

基礎からはじめる物理ベースレンダリング - Qiita

academy.substance3d.com

www.an.shimadzu.co.jp

レガシーコードからの脱却 6章 プラクティス2 小さなバッチで作る

レガシーコードからの脱却 6章 プラクティス2 小さなバッチで作る

スクラムのプラクティスの1つにタイムボックスがある. タイムボックスに収めるために,開発者は大きな機能を小さなタスクに分割する必要が出てくる. 1つの機能やタスクではなく,複数の機能を同時に作って最後のリリースを目指すため,実際にやるのは難しい.

タスクのサイズが機能で小さいのであれば,スコープボックスを選ぶのが良い. 機能を小さなタスクに分割するのになれるまでは,タイムボックスを使うと良い.

分析,設計,コーディング,テスト,デプロイというバラバラの工程に分けてソフトウェアを作るのではなく,機能単位で作っていく. つまり数週間ごとに動いているシステムに機能を追加していくほうが,よほど単純でリスクも少ない.

ソフトウェア開発におけるトップチームの秘密の1つは,チームがとても小さいことである. 人間同士のやり取りに多くの時間がかかるためである.

下記の点から,小さいほうが良いと言える. 小さく分割するのが重要.

  • 理解しやすい
  • 見積もりやすい
  • 実装しやすい
  • テストしやすい

とある優秀な開発者はテストを20秒ごとに実行している. 良い開発者であるために取り入れると良い土台の1つだ.

ソフトウェア開発は精神的な負担の大きい職業で,40際を超えてくると以前よりスピードが落ちてくるのが一般的.

大事なものの一つとして,ビルドを高速化するというもんがある. 3秒以内に結果を返してくれるようなビルド環境を作るのが大切.

バックログ(作りたいと思っているストーリーのリスト)を作って残しておく. テーマごと,ユーザーの種類ごと,目的など自分に合う方法で整理すれば良い. リリースできるように機能を集めていく(最小市場可能機能セット:MMF)ことを行い,リリースで絶対必要なものを考える.

実践

ソフトウェア開発を計測する7つの戦略

  • 価値実現までの時間を計測する
  • コーディングに使った時間を計測する
  • 欠陥密度(コード1000行あたりのバグの数)を計測する
  • 欠陥検出までの時間を計測する
  • 機能ごとの顧客価値を計測する
  • 機能を提供しない場合のコストを計測する
  • フィードバックループの効率を計測する

ストーリーを分割する7つの戦略 ストーリーは短いほどよい.

  • 複数のことが混じったストーリーを要素に分解する
  • 複雑なストーリーを既知のことと道のことで分離する
  • 道のことをわかるまで繰り返す
  • 受け入れ基準をもとに分割する
  • 依存関係を最小にする
  • 意図を1つにする
  • ストーリーをテスト可能に保つ

落合先生の論文の読み方

改めて資料を眺めてまとめる.

トレンドを読むことは重要.勉強することも重要. しかし一番重要なのは,トレンドを作る側になること. はやりのコンテクストからどれだけ離脱し,さらにどれだけ先人達と違うことをできるか.

読む順番

アブスト→結論→実験→関連研究 時間を決めて一気に読む(例:1時間) *まとめることを前提に読む

まとめのフォーマット

1.どんなもの? 2.先行研究と比べてどこがすごい? 3.技術や手法のキモはどこ? 4.どうやって有効だと検証した? 5.議論はある? 6.次に読むべき論文は? リファレンスから次に読む論文を決める.

www.slideshare.net

Dockerとは

今回は,Dockerとはなにかというについてまとめます.

本記事は,いくつかの記事を見て理解したことをまとめたものです. 参考にした記事は最後にリンクを貼りました.

Dockerとは

Dockerとは,軽量なコンテナ型のアプリケーション実行環境. Docker社が2013年にオープンソースとして公開した.

他の方式との違い

独立したアプリケーション実行環境として,ハイパーバイザ型(Hyper-V)などホスト型(VMware PlayerやWindows Virtual PC, VirtualBoxあど)がある. これらの方式は,目的のアプリケーションとは関係のないサービスなども多数動作するため,オーバーヘッドが大きく,リソースも無駄に多く必要になりがち.

これに対してコンテナ型の仮想化環境とは,Linuxカーネルがもつコンテナ機能などを使って,実行環境を他のプロセスから隔離し,その中でアプリケーションを動作させる. コンテナはLinuxの通常のプロセスとほぼ同じものだが,利用できる名前空間リソースが他のプロセスやコンテナから隔離され,それぞれ固有の設定を持てる. コンテナを管理するコストはプロセスを管理するコストとほぼ変わらず,仮想化マシンを管理するコストと比較すると非情に軽い.

ファイルシステムやコンピュータ名,ユーザー名(ユーザーID),グループ名(グループID),プロセスID,ネットワーク機能などを,コンテナごとに独自に設定できるようにする機能.

  • リソースの隔離機能

CPUやメモリ,ディスク入出力など,コンテナ内で利用するリソースを他のコンテナから隔離したり,設定に基づいて振り分けたりする機能.

3つの方式を比較した図を下記に示す.

f:id:engineerAlex:20200524141509j:plain
仮想化技術の種類.[リンク先より引用]www.atmarkit.co.jp
  • ホスト型

ホストOS上にハードウエアをエミュレートするアプリケーションを動作させ,その上でゲストOSを動作させる. 仮想化アプリケーションを簡単に導入でき仮想マシンの管理も簡単な反面,ホストOSのオーバーヘッドがあるため速度的に不利である.

  • ハイパーバイザー型

物理サーバー上にハードウエアをエミュレートする仮想化プロダクト(ハイパーバイザー)を直接導入し,ハイパーバイザー上でゲストOSを動作させる. ホストOSのオーバーヘッドがないため,ホスト型よりも速度的に有利である.

  • コンテナ型

ホスト型やハイパーバイザー型のようなハードウエアエミュレートは行わず,Linuxの各種コンテナ技術(リソース割当量の調整を行うcgroupや,プロセス空間やネットワーク空間などを分離するnamespaceなど)を用いてコンテナを構成する.

各コンテナはホストOSのカーネルを共有するが,コンテナ技術によってユーザープロセスやネットワーク,ディスク領域などが他のコンテナから隔離されるため,利用者からすれば新しい仮想マシンが立ち上がったように見える. ホストOSのカーネルを共有するため,コンテナの起動が圧倒的に速くオーバーヘッドも小さい.

Dockerイメージとは

Dockerではアプリケーションとその実行環境、展開/操作方法などをまとめて1つのパッケージにし,それをDocker imageとして保存/配布する. イメージはDocker hub」に公開されている.

Docker imageをDocker Engine上で起動したものがDockerのコンテナになる. そのコンテナ内で必要なアプリケーションをインストールし,カスタマイズしてそれをディスクに保存すれば,新しいDocker imageとして利用できる. この方法は,すでに存在するimageや新しいimageをカスタマイズしたり,コンポーネントをバージョンアップするには不便である. 手動でカスタマイズした内容を,新しいimageに対してもう一度適用しなければならないからである.

そのような場合は,Dockerfileというスクリプト機能を使うことになる. このファイルにimageに対して適用する支持を記述しておき,Dockerfileをベースとなるイメージに適用すれば,同じソフトウェア環境を用意することが可能である.

DOcker imageの履歴管理

DOckerのコンテナ内ではimage中のファイルシステムはすべて書き込み禁止になっており,書き込まれた内容はすべて新しいレイヤーに保存される.元のimageの内容との差分データだけを別ファイルとして扱う. レイヤーの内容は適宜コミッt0することにより,新しいimageとして保存できる.

参考にした記事

www.atmarkit.co.jp

www.kagoya.jp

www.atmarkit.co.jp