Windows 上の Dockerfile

Docker エンジンには、コンテナーイメージの作成を自動化するツールが含まれています。 このコマンドを実行して、コンテナーの画像docker commitを手動で作成することもできますが、自動イメージ作成プロセスを採用すると、次のようなさまざまなメリットが得られます。

  • コンテナー イメージをコードとして保存。
  • メンテナンスやアップグレードの目的による、コンテナー イメージの迅速かつ正確な再作成。
  • コンテナー イメージと開発サイクル間の継続的な統合。

この自動処理を行う Docker コンポーネントは、Dockerfile であり、docker build コマンドです。

Dockerfile は、新しいコンテナーイメージを作成するために必要な命令が含まれているテキストファイルです。 たとえば、ベースとして使用する既存のイメージの指定、イメージの作成プロセス時に実行されるコマンド、コンテナー イメージの新しいインスタンスが展開されるときに実行されるコマンドなどの命令が含まれます。

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

このトピックでは、Windows コンテナーでの Dockerfiles の使い方、基本的な構文の理解、および最も一般的な Dockerfiles 命令の内容について説明します。

このドキュメントでは、コンテナイメージとコンテナイメージレイヤーの概念について説明します。 画像と画像の階層化の詳細については、「コンテナーの基本イメージ」をご覧ください。

Dockerfiles について詳しくは、 Dockerfiles リファレンスをご覧ください。

基本構文

ごく基本的なフォームでは、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 用の Dockerfiles のその他の例については、「 windows リポジトリ用の Dockerfiles」をご覧ください。

手順

Dockerfile 命令は、コンテナーイメージを作成するために必要な操作を、Docker エンジンに提供します。 これらの手順は、順番に1つずつ、または順に実行されます。 次の例は、Dockerfiles で最も一般的に使用される手順です。 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 命令は、コマンドを実行し、新しいコンテナー イメージにキャプチャするように指定します。 これらのコマンドには、ソフトウェアのインストール、ファイルとディレクトリの作成、環境構成の作成などの項目が含まれます。

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

# exec form

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

# shell form

RUN <command>

Exec と shell の形式の違いは、命令の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 で実行する場合の考慮事項

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

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

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

Windows で実行する場合の例

次の 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

実行命令の詳細については、「実行」を参照してください。

コピー

このCOPY命令によって、ファイルとディレクトリがコンテナーのファイルシステムにコピーされます。 ファイルとディレクトリは、Dockerfile からの相対パスである必要があります。

指示COPYの書式は、次のようになります。

COPY <source> <destination>

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

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

Windows でのコピーの使用に関する考慮事項

Windows では、変換先形式でスラッシュを使用する必要があります。 たとえば、次のようなCOPY操作を行うことができます。

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

一方、次の形式のバックスラッシュは使用できません。

COPY test1.txt c:\temp\

Windows でのコピーの使用例

次の例では、ソースディレクトリの内容をコンテナーの画像sqlliteで指定したディレクトリに追加します。

COPY source /sqlite/

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

COPY config* c:/temp/

手順のCOPY詳細については、「コピーの参照」を参照してください。

ADD

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

指示ADDの書式は、次のようになります。

ADD <source> <destination>

ソースまたは宛先に空白が含まれている場合は、パスを角かっこで囲み、二重引用符で囲みます。

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

Windows での追加を実行する場合の考慮事項

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/

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

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

手順のADD詳細については、「参照を追加する」を参照してください。

WORKDIR

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

指示WORKDIRの書式は、次のようになります。

WORKDIR <path to working directory>

Windows でのワークディレクトリの使用に関する考慮事項

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

WORKDIR c:\\windows

WORKDIR c:\\Apache24\\bin

WORKDIR手順の詳細については、「ワーク dir リファレンス」を参照してください。

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 のファイルパスの区切り文字でもあるため、複数の行にまたがって使用すると、問題が発生する可能性があります。 これを回避するには、パーサーディレクティブを使って既定のエスケープ文字を変更します。 パーサーディレクティブの詳細については、「パーサーディレクティブ」を参照してください。

次の例は、既定のエスケープ文字を使って複数の行にわたる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 ビルドの完全なドキュメントについては、ビルドのリファレンスをご覧ください。

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

その他の閲覧と参照