🧻

Dockerfileの作り方

2023/07/24に公開

Dockerfileとは

オリジナルのdockerイメージを作る場合の設計書のようなもの

Dockerfileが必要な理由

DockerHubのイメージには最低限の機能しか入っていない(ベースイメージ)

イメージから生成したコンテナ上でカスタマイズしても、コンテナを作り直すと元に戻る
コンテナでは共有ができない

故にカスタマイズ環境を共有したい場合は、自分でDockerfileを作る必要がある

Dockerfileからdockerイメージを作成する

Dockerfileからdockerイメージを作成するコマンド
ビルドコンテキスト(ディレクトリ)以下にDockerfileを配置する場合

docker image build <ビルドコンテキストのパス>

ビルドコンテキスト外にDockerfileを配置する場合

docker image build -f <Dockerfileのパス> <ビルドコンテキストのパス>

イメージにREPOSITORY, TAGをつける

docker image build -t <REPOSITORY:TAG> <Dockerfileがあるディレクトリへのパス>

ビルドコンテキスト内に不要なファイル・渡したくないファイルがある場合、
.dockerignoreを作成して不要ファイルを指定することができる
大容量ファイルや秘匿情報が含まれているファイルなどを指定する

.dockerignoreのサンプル
でかいファイル.zip

Dockerfileの内容

()は省略可能

FROM ubuntu(:<TAG>)

# ubuntuで実行したいコマンド
RUN <コマンド>
# 続けてコマンドを実行
RUN <コマンド>
# コマンドを一行で書くことも可能
RUN <コマンド> && <コマンド> && <コマンド>
# 行ごとにキャッシュされるので、決まった処理はまとめて書くとbuildにかかる時間が短くなり、容量も小さくできる
# 開発初期段階など、コマンドが増える可能性がある場合は行を分けて書くほうがよさそう

# コピーする
# コピー元はビルドコンテキストに存在すること
COPY <ホストのコピー元> <コピー先>

# デフォルトコマンドを設定する
# 省略した場合はubuntuのデフォルトコマンド(/bin/bash)
# docker image inspect <IMAGE> でConfig.Cmdに設定されているもの
# 設定できるのは(最後に書いた)ひとつだけ
CMD ["<コマンド>", "<オプション>"]

# 環境変数を設定する
ENV <キー>=<値>
# 環境変数をまとめて設定することも可能
ENV <キー>=<値> <キー>=<値> <キー>=<値>

# docker build時に任意の変数を扱う(container実行時には無効)
ARG <キー>=<デフォルト値>
# デフォルト値を渡さないことも可能
ARG <キー>

# 作業ディレクトリを指定する
# 指定ディレクトリが存在しない場合は作成する
# 省略した場合はデフォルト(/)
WORKDIR <作業ディレクトリへのパス>

サンプル

# ubuntu:20.04がベース
FROM ubuntu:20.04
# パッケージ一覧を更新
RUN apt update
# curlをインストール、途中の質問にはyesで答える
RUN apt install -y curl
# vimをインストール、途中の質問にはyesで答える
RUN apt install -y vim
# まとめた場合
# RUN apt update && apt install -y curl vim

# ローカルのhello.txtを/appに配置する
COPY ./hello.txt /app/

# デフォルトコマンドを設定する
CMD ["ls", "-la"]

# 環境変数を設定する
ENV hello="Hello World"
ENV hoge=HOGEHOGE

# 任意の変数を扱う
ARG message

# 作業ディレクトリを指定する
WORKDIR /app/my_dir
# /app/my_dir/1.txtが作成される
RUN touch 1.txt

# 作業ディレクトリを変更する
WORKDIR ..
# /app/2.txtが作成される
RUN touch 2.txt


Discussion