• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

dockerfilee

date: 2022-09-24 excerpt: dockerfileの使い方と書き方

tag: containerdockerdockerfile


dockerfileの使い方と書き方

概要

  • コンテナをビルドするときのファイル
  • Makefileに相当するもの

機能の説明

WORKDIR

  • dockerを実行した時、どのディレクトリから始めるか

ENTRYPOINT

  • 実行時のコマンド
  • 文字列としてエスケープしたりする必要はない

CMD

  • 実行時のコマンド
  • 文字列としてエスケープしたりする必要はない
  • ENTRYPOINTとの違いは、CMDはENTRYPOINTの実行後に実行される補助的なものである

例

CMD gunicorn --bind 0.0.0.0:$PORT --workers=2 bin:app

ARG

  • dockerfile内部に変数を与える
  • ローカル開発と本番で使用する基底イメージが異なる時
  • dockerfile内部で挙動を変えたいときなど

例

ARG BASE_CONTAINER=nvidia-base-container:latest
FROM $BASE_CONTAINER

WORKDIR /
COPY . /app/
RUN pip install -r ./app/requirements.txt
WORKDIR /app
  • BASE_CONTAINERにデフォルトの値としてnvidia-base-container:latestを与えている
  • BASE_CONTAINERはビルド時に指定することで明示的にオーバーライドできる

例

$ docker build . --build-arg BASE_CONTAINER="ubuntu"

環境変数をdockerfile内部で使う

  • 例えば$HOMEが必要なときに以下のような記述が可能
RUN cd /tmp/mecab-ipadic-neologd; ./bin/install-mecab-ipadic-neologd -n -y --prefix $HOME/.lib/mecab-ipadic-neologd;

.dockerignoreについて

  • docker build時にsending build context to docker daemonと出てスタックする場合、非常に大きなディレクトリがプロジェクトの下にあるケースが有る
  • .dockerignoreを追加して特定のディレクトリをスキップするようにする
  • この設定はDockerfile内部でも有効

例

# Ignore all log files
*.log

# Except this one
!important.log

# Ignore node_modules directory
node_modules/

# Ignore temporary files
*.tmp
*.swp
*.bak

# 任意のサブディレクトリ名をもつものを無視する
**/subdir/

# 任意のサブディレクトリにあるファイルを無視する
**/*.log

# Ignore git related files
.git/
.gitignore

# Ignore venv
.venv/

cacheを有効に使いこなす

  • ダウンロードが発生するコマンドはできるだけ早い段階に持ってくる
  • コードの変更が発生する部分は最後に持ってきて、影響を最小限に留める
  • 参考
    • Docker のキャッシュを全力で使いこなそう


containerdockerdockerfile Share Tweet