次の方法で共有


Windows 上の Dockerfile

Docker エンジンには、コンテナー イメージの作成を自動化するツールが含まれています。 docker commit コマンドを実行してコンテナー イメージを手動で作成できますが、自動イメージ作成プロセスを採用すると、次のような多くの利点があります。

  • コンテナー イメージをコードとして格納する。
  • メンテナンスとアップグレードの目的で、コンテナー イメージを迅速かつ正確に再作成します。
  • コンテナー イメージと開発サイクルの間の継続的インテグレーション。

この自動化を推進する Docker コンポーネントは、Dockerfile と docker build コマンドです。

Dockerfile は、新しいコンテナー イメージを作成するために必要な手順を含むテキスト ファイルです。 これらの手順には、ベースとして使用する既存のイメージの識別、イメージ作成プロセス中に実行されるコマンド、コンテナー イメージの新しいインスタンスがデプロイされたときに実行されるコマンドが含まれます。

Docker ビルドは、Dockerfile を使用し、イメージ作成プロセスをトリガーする Docker エンジン コマンドです。

このトピックでは、Windows コンテナーで Dockerfile を使用する方法、基本的な構文、最も一般的な Dockerfile の手順について説明します。

このドキュメントでは、コンテナー イメージとコンテナー イメージ レイヤーの概念について説明します。 イメージとイメージのレイヤー化の詳細については、コンテナーの基本イメージ 参照してください。

Dockerfile の詳細については、Dockerfile リファレンスを参照してください。

基本的な構文

最も基本的な形式では、Dockerfile は非常に単純です。 次の例では、IIS と "hello world" サイトを含む新しいイメージを作成します。 この例には、各手順を説明するコメント (#で示されます) が含まれています。 この記事の以降のセクションでは、Dockerfile 構文規則と Dockerfile の手順について詳しく説明します。

手記

Dockerfile は、拡張子なしで作成する必要があります。 Windows でこれを行うには、任意のエディターでファイルを作成し、"Dockerfile" (引用符を含む) という表記で保存します。

# Sample Dockerfile

# Indicates that the windowsservercore image will be used as the base image.
FROM mcr.microsoft.com/windows/servercore:ltsc2019

# Metadata indicating an image maintainer.
LABEL maintainer="jshelton@contoso.com"

# Uses dism.exe to install the IIS role.
RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart

# Creates an HTML file and adds content to this file.
RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html

# Sets a command or process that will run each time a container is run from the new image.
CMD [ "cmd" ]

Windows 用 Dockerfile のその他の例については、Dockerfile for Windows リポジトリのを参照してください。

手順

Dockerfile の手順では、コンテナー イメージを作成するために必要な手順を Docker エンジンに提供します。 これらの命令は、1 つずつ順番に実行されます。 次の例は、Dockerfile で最もよく使用される手順です。 Dockerfile の手順の完全な一覧については、Dockerfile リファレンスを参照してください。

FROM

FROM 命令は、新しいイメージ作成プロセス中に使用されるコンテナー イメージを設定します。 たとえば、命令 FROM mcr.microsoft.com/windows/servercoreを使用する場合、結果のイメージは Windows Server Core 基本 OS イメージから派生し、依存関係を持ちます。 Docker ビルド プロセスが実行されているシステムに指定されたイメージが存在しない場合、Docker エンジンはパブリックまたはプライベート イメージ レジストリからイメージのダウンロードを試みます。

FROM 命令の形式は次のようになります。

FROM <image>

FROM コマンドの例を次に示します。

Microsoft Container Registry (MCR) から ltsc2019 バージョンの Windows Server Core をダウンロードするには、

FROM mcr.microsoft.com/windows/servercore:ltsc2019

詳細については、FROM リファレンスを参照してください。

走れ

RUN 命令は、実行するコマンドを指定し、新しいコンテナー イメージにキャプチャします。 これらのコマンドには、ソフトウェアのインストール、ファイルとディレクトリの作成、環境構成の作成などの項目を含めることができます。

RUN 命令は次のようになります。

# exec form

RUN ["<executable>", "<param 1>", "<param 2>"]

# shell form

RUN <command>

exec 形式とシェル 形式の違いは、RUN 命令の実行方法にあります。 exec フォームを使用すると、指定されたプログラムが明示的に実行されます。

exec 形式の例を次に示します。

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN ["powershell", "New-Item", "c:/test"]

結果のイメージでは、powershell New-Item c:/test コマンドが実行されます。

docker history doc-exe-method

IMAGE               CREATED             CREATED BY                    SIZE                COMMENT
b3452b13e472        2 minutes ago       powershell New-Item c:/test   30.76 MB

これに対し、次の例では、シェル形式で同じ操作を実行します。

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell New-Item c:\test

結果のイメージには、cmd /S /C powershell New-Item c:\testの実行命令があります。

docker history doc-shell-method

IMAGE               CREATED             CREATED BY                              SIZE                COMMENT
062a543374fc        19 seconds ago      cmd /S /C powershell New-Item c:\test   30.76 MB

Windows での RUN の使用に関する考慮事項

Windows では、exec 形式で RUN 命令を使用する場合は、バックスラッシュをエスケープする必要があります。

RUN ["powershell", "New-Item", "c:\\test"]

ターゲット プログラムが Windows インストーラーの場合は、実際の (サイレント) インストール手順を起動する前に、/x:<directory> フラグを使用してセットアップを抽出する必要があります。 他の操作を行う前に、コマンドが終了するのを待つ必要もあります。 そうしないと、プロセスは何もインストールせずに途中で終了します。 詳細については、以下の例を参照してください。

Windows で RUN を使用する例

次の Dockerfile の例では、DISM を使用してコンテナー イメージに IIS をインストールします。

RUN dism.exe /online /enable-feature /all /featurename:iis-webserver /NoRestart

この例では、Visual Studio 再頒布可能パッケージをインストールします。 インストーラーの実行には、Start-Process-Wait パラメーターが使用されます。 これにより、Dockerfile の次の命令に進む前にインストールが完了します。

RUN powershell.exe -Command Start-Process c:\vcredist_x86.exe -ArgumentList '/quiet' -Wait

RUN 命令の詳細については、RUN リファレンスを参照してください。

COPY

COPY 命令は、コンテナーのファイル システムにファイルとディレクトリをコピーします。 ファイルとディレクトリは、Dockerfile に対する相対パスに含まれている必要があります。

COPY 命令の形式は次のようになります。

COPY <source> <destination>

ソースまたは変換先に空白が含まれている場合は、次の例に示すように、パスを角かっこと二重引用符で囲みます。

COPY ["<source>", "<destination>"]

Windows での COPY の使用に関する考慮事項

Windows では、変換先の形式にスラッシュを使用する必要があります。 たとえば、有効な COPY 手順は次のとおりです。

COPY test1.txt /temp/
COPY test1.txt c:/temp/

一方、バックスラッシュを使用した次の形式は機能しません。

COPY test1.txt c:\temp\

Windows で COPY を使用する例

次の例では、コンテナー イメージ内の sqllite という名前のディレクトリにソース ディレクトリの内容を追加します。

COPY source /sqlite/

次の例では、構成で始まるすべてのファイルをコンテナー イメージの c:\temp ディレクトリに追加します。

COPY config* c:/temp/

COPY 命令の詳細については、COPY リファレンスを参照してください。

ADD

ADD 命令は COPY 命令に似ていますが、さらに多くの機能があります。 ADD 命令では、ホストからコンテナー イメージにファイルをコピーするだけでなく、URL 仕様でリモートの場所からファイルをコピーすることもできます。

ADD 命令の形式は次のようになります。

ADD <source> <destination>

ソースまたは変換先のいずれかに空白が含まれている場合は、パスを角括弧と二重引用符で囲みます。

ADD ["<source>", "<destination>"]

Windows での ADD の実行に関する考慮事項

Windows では、変換先の形式にスラッシュを使用する必要があります。 たとえば、有効な ADD 手順は次のとおりです。

ADD test1.txt /temp/
ADD test1.txt c:/temp/

一方、バックスラッシュを使用した次の形式は機能しません。

ADD test1.txt c:\temp\

さらに、Linux では、ADD 命令によって、コピー時に圧縮パッケージが拡張されます。 この機能は Windows では使用できません。

Windows で ADD を使用する例

次の例では、コンテナー イメージ内の sqllite という名前のディレクトリにソース ディレクトリの内容を追加します。

ADD source /sqlite/

次の例では、"config" で始まるすべてのファイルをコンテナー イメージの c:\temp ディレクトリに追加します。

ADD config* c:/temp/

次の例では、コンテナー イメージの c:\temp ディレクトリに Python for Windows をダウンロードします。

ADD https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-3.5.1.exe

ADD 命令の詳細については、ADD リファレンスを参照してください。

WORKDIR

WORKDIR 命令は、RUNCMDなど、他の Dockerfile 命令用の作業ディレクトリと、コンテナー イメージのインスタンスを実行するための作業ディレクトリを設定します。

WORKDIR 命令の形式は次のようになります。

WORKDIR <path to working directory>

Windows での WORKDIR の使用に関する考慮事項

Windows では、作業ディレクトリにバックスラッシュが含まれている場合、エスケープする必要があります。

WORKDIR c:\\windows

WORKDIR c:\\Apache24\\bin

WORKDIR 命令の詳細については、WORKDIR リファレンスを参照してください。

CMD

CMD 命令は、コンテナー イメージのインスタンスをデプロイするときに実行する既定のコマンドを設定します。 たとえば、コンテナーが NGINX Web サーバーをホストする場合、CMD には、nginx.exeなどのコマンドを使用して Web サーバーを起動する手順が含まれる場合があります。 Dockerfile で複数の CMD 命令が指定されている場合は、最後の命令のみが評価されます。

CMD 命令の形式は次のようになります。

# exec form

CMD ["<executable", "<param>"]

# shell form

CMD <command>

Windows での CMD の使用に関する考慮事項

Windows では、CMD 命令で指定するファイル パスにはスラッシュを使用するか、エスケープされたバックスラッシュ (\\) を使用する必要があります。 有効な CMD 手順を次に示します。

# exec form

CMD ["c:\\Apache24\\bin\\httpd.exe", "-w"]

# shell form

CMD c:\\Apache24\\bin\\httpd.exe -w

ただし、適切なスラッシュのない次の形式は機能しません。

CMD c:\Apache24\bin\httpd.exe -w

CMD 命令の詳細については、CMD リファレンスを参照してください。

エスケープ文字

多くの場合、Dockerfile 命令は複数行にまたがる必要があります。 これを行うには、エスケープ文字を使用できます。 既定の Dockerfile エスケープ文字は円記号 \です。 ただし、円記号は Windows のファイル パスの区切り記号でもあるため、複数の行にまたがる場合に問題が発生する可能性があります。 これを回避するには、パーサー ディレクティブを使用して、既定のエスケープ文字を変更します。 パーサー ディレクティブの詳細については、「Parser ディレクティブの」を参照してください。

次の例は、既定のエスケープ文字を使用して複数行にまたがる 1 つの RUN 命令を示しています。

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command \
    $ErrorActionPreference = 'Stop'; \
    wget https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:\python-3.5.1.exe ; \
    Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; \
    Remove-Item c:\python-3.5.1.exe -Force

エスケープ文字を変更するには、Dockerfile の最初の行にエスケープ パーサー ディレクティブを配置します。 これは、次の例で確認できます。

手記

エスケープ文字として使用できる値は、\`の 2 つだけです。

# escape=`

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command `
    $ErrorActionPreference = 'Stop'; `
    wget https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:\python-3.5.1.exe ; `
    Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; `
    Remove-Item c:\python-3.5.1.exe -Force

エスケープ パーサー ディレクティブの詳細については、「エスケープ パーサー ディレクティブ を参照してください。

Dockerfile の PowerShell

PowerShell コマンドレット

PowerShell コマンドレットは、RUN 操作を使用して Dockerfile で実行できます。

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell -command Expand-Archive -Path c:\apache.zip -DestinationPath c:\

REST 呼び出し

PowerShell の Invoke-WebRequest コマンドレットは、Web サービスから情報やファイルを収集するときに役立ちます。 たとえば、Python を含むイメージをビルドする場合は、次の例に示すように、$ProgressPreferenceSilentlyContinue に設定して、より高速なダウンロードを実現できます。

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command \
  $ErrorActionPreference = 'Stop'; \
  $ProgressPreference = 'SilentlyContinue'; \
  Invoke-WebRequest https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe -OutFile c:\python-3.5.1.exe ; \
  Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; \
  Remove-Item c:\python-3.5.1.exe -Force

手記

Invoke-WebRequest は Nano Server でも機能します。

イメージの作成プロセス中に PowerShell を使用してファイルをダウンロードするもう 1 つのオプションは、.NET WebClient ライブラリを使用することです。 これにより、ダウンロードのパフォーマンスが向上する可能性があります。 次の例では、WebClient ライブラリを使用して Python ソフトウェアをダウンロードします。

FROM mcr.microsoft.com/windows/servercore:ltsc2019

RUN powershell.exe -Command \
  $ErrorActionPreference = 'Stop'; \
  (New-Object System.Net.WebClient).DownloadFile('https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe','c:\python-3.5.1.exe') ; \
  Start-Process c:\python-3.5.1.exe -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1' -Wait ; \
  Remove-Item c:\python-3.5.1.exe -Force

手記

Nano Server は現在、WebClient をサポートしていません。

PowerShell スクリプト

場合によっては、イメージの作成プロセス中に使用するコンテナーにスクリプトをコピーしてから、コンテナー内からスクリプトを実行すると便利な場合があります。

手記

これにより、イメージ レイヤーのキャッシュが制限され、Dockerfile の読みやすさが低下します。

この例では、ADD 命令を使用して、ビルド マシンからコンテナーにスクリプトをコピーします。 このスクリプトは、RUN 命令を使用して実行されます。

FROM mcr.microsoft.com/windows/servercore:ltsc2019
ADD script.ps1 /windows/temp/script.ps1
RUN powershell.exe -executionpolicy bypass c:\windows\temp\script.ps1

Docker のビルド

Dockerfile が作成されてディスクに保存されたら、docker build を実行して新しいイメージを作成できます。 docker build コマンドは、いくつかの省略可能なパラメーターと Dockerfile へのパスを受け取ります。 すべてのビルド オプションの一覧を含む Docker Build の完全なドキュメントについては、ビルドリファレンス を参照してください。

docker build コマンドの形式は次のようになります。

docker build [OPTIONS] PATH

たとえば、次のコマンドを実行すると、"iis" という名前のイメージが作成されます。

docker build -t iis .

ビルド プロセスが開始されると、出力は状態を示し、エラーが発生した場合、それを返します。

C:\> docker build -t iis .

Sending build context to Docker daemon 2.048 kB
Step 1 : FROM mcr.microsoft.com/windows/servercore:ltsc2019
 ---> 6801d964fda5

Step 2 : RUN dism /online /enable-feature /all /featurename:iis-webserver /NoRestart
 ---> Running in ae8759fb47db

Deployment Image Servicing and Management tool
Version: 10.0.10586.0

Image Version: 10.0.10586.0

Enabling feature(s)
The operation completed successfully.

 ---> 4cd675d35444
Removing intermediate container ae8759fb47db

Step 3 : RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html
 ---> Running in 9a26b8bcaa3a
 ---> e2aafdfbe392
Removing intermediate container 9a26b8bcaa3a

Successfully built e2aafdfbe392

結果は新しいコンテナー イメージであり、この例では "iis" という名前になります。

docker images

REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
iis                 latest              e2aafdfbe392        About a minute ago   207.8 MB
windowsservercore   latest              6801d964fda5        4 months ago         0 B

参考文献とさらに読むべき資料