Docker - Dockerfile

提供:MochiuWiki : SUSE, EC, PCB
2024年8月6日 (火) 12:10時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == <br><br> == Dockerfileの基礎 == ==== Dockerfileの概要 ==== Dockerfileは、Dockerイメージの設計図のようなものである。 Dockerfileを作成することにより、任意のDockerイメージを作成できる。 <br> DockerfileからDockerイメージを作成するには、Dockerfileが存在するディレクトリで以下のコマンドを実行する。<br> # イメージ名およびタグ名、Dockerファイル名を指定…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要



Dockerfileの基礎

Dockerfileの概要

Dockerfileは、Dockerイメージの設計図のようなものである。 Dockerfileを作成することにより、任意のDockerイメージを作成できる。
DockerfileからDockerイメージを作成するには、Dockerfileが存在するディレクトリで以下のコマンドを実行する。

# イメージ名およびタグ名、Dockerファイル名を指定する場合
sudo docker build -t <イメージ名>:<タグ名> -f <Dockerファイル名> .

# イメージ名およびタグ名、Dockerファイル名(Dockerファイル名がdockerfileの場合のみ)は省略できる
sudo docker build .


Dockerfileで使用するコマンドを、以下に示す。

  • FROM
  • RUN
  • CMD
  • ENTRYPOINT
  • COPY
  • ADD
  • ENV
  • WORKDIR


Dockerfileの作成手順

  • FROM
    ベースとなるイメージを決定するコマンドである。
    Dockerfileの先頭に記述する。
    FROMの後には、基本的にOSを記述する。


例1. FROM centos7:latest
例2. FROM ruby:2.5


  • RUN
    FROMで記述したOSに対応するコマンドを実行するコマンドである。
    RUNごとにLayerが作成される。(Dockerイメージは、レイヤーを積み重ねていくように作成される)

    以下の例では、Dockerイメージには、centos7のレイヤーにtouch /usr/bin/testのレイヤーが追加作成される。
    (/usr/bin/testファイルを作成するDockerイメージを作成している)
例. FROM centos7:latest
    RUN ["touch", "/usr/bin/test"]

以下の例では、Dockerイメージには、centos7のレイヤーにcurlとnginxという2つのパッケージをインストールするレイヤーが追加作成される。
(yum updateはインストールするパッケージを新しいものにするために記述して、yum install -yはパッケージをインストールするために記述している)
例. FROM centos7:latest
    RUN yum update && yum install -y curl nginx

DockerfileからDockerイメージを1度作成したものはキャッシュされるため、RUNを複数記述することにより、ビルドの時間を短くすることができる。
ただし、レイヤー数は少ない方が望ましいため、&&や\を使用して、RUNの記述を少なくする。


  • CMD
    コンテナの実行コマンドを指定するコマンドである。
    Dockerfileの最後に記述する。

    以下の例では、DockerfileからDockerイメージを作成、docker runコマンドによりコンテナを作成した後、/bin/bashを実行している。
例. FROM centos7:latest
    RUN yum update && yum install -y curl nginx
    CMD ["/bin/bash"]


  • ENTRYPOINT
    CMDに近い役割を持つコマンドである。
    CMDは、Dockerコンテナを作成・実行する時(docker runコマンド)、コマンドを上書きできるが、
    (例. docker run lsコマンドを実行する場合、上記のCMDの例ではbashではなく、lsが実行される)
    ENTRYPOINTを使用する場合、コマンドは上書きできなくなり、CMDはENTRYPOINTのオプションを記述する形となる。

    以下の例では、ENTRYPOINTlsコマンドを記述することにより、コンテナ実行時(docker runコマンド)に、ls以外のコマンドが実行できなくなる。
    なお、CMDでは、--helpオプションを指定している。
例. FROM centos7:latest
    RUN yum update && yum install -y curl nginx
    ENTRYPOINT ["ls"]
    CMD ["--help"]


  • COPY
    Dockerfileが存在するディレクトリ(BuildContextという)にあるファイルを、Dockerイメージにコピーするコマンドである。
    DockerfileをビルドしてDockerイメージからコンテナを作成した後、コンテナにNewDirディレクトリを作成して、Test.txtファイルをコピーしている。
    この時、Dockerイメージのレイヤーが追加・作成される。
例. FROM ubuntu:latest
    RUN mkdir /NewDir
    COPY Test.txt /NewDir
    CMD ["/bin/bash"]


  • ADD
    COPYのコマンドと似ていて、同じくコピーができるインストラクションです。

    ADDとCOPYとの違い
    ADDは圧縮ファイルをコピーした際、コピーと解凍の両方を行います。
    COPYは単純なコピーのみです。
    圧縮ファイルをコピー・解凍する時にはADD、圧縮ファイルが関係ない単純なコピーにはCOPYを使います。

    以下の例では、Dockerfileをbuildした際、DockerImageにsample.tarを/(ルート直下)にコピー・解凍するLayerを作成されます。
    コンテナを作成した際に、コンテナのルート直下にsample.tarが解凍されたものが作成されています。
例. FROM ubuntu:latest
    ADD sample.tar /
    CMD ["/bin/bash"]


  • ENV
    環境変数を設定するインストラクションです。

    以下の例では、コンテナ作成時にkey1=valueという環境変数が設定されるDockerImageが作成されます。
例. FROM ubuntu:latest
    ENV key1 value
    CMD ["/bin/bash"]


  • WORKDIR
    インストラクションの実行ディレクトリを変更するインストラクションです。

    以下の例では、sample_folderというディレクトリを作り、sample_folder内でsample_fileを作成するLayerとなります。
    (WORKDIRを使ったことで、コンテナ内に作成した/sample_folderの中でRUNの実行ができます。)
例. FROM ubuntu:latest
    RUN mkdir sample_folder
    WORKDIR /sample_folder
    RUN touch sample_file