Windows 上の DockerfileDockerfile on Windows

Docker エンジンには、コンテナー イメージの作成を自動化するツールが含まれています。The Docker engine includes tools that automate container image creation. docker commit コマンドを使用して手動でコンテナー イメージを作成することもできますが、イメージの自動作成プロセスを使用すると、次のような多くの利点があります。While you can create container images manually by running the docker commit command, adopting an automated image creation process has many benefits, including:

  • コンテナー イメージをコードとして保存。Storing container images as code.
  • メンテナンスやアップグレードの目的による、コンテナー イメージの迅速かつ正確な再作成。Rapid and precise recreation of container images for maintenance and upgrade purposes.
  • コンテナー イメージと開発サイクル間の継続的な統合。Continuous integration between container images and the development cycle.

この自動処理を行う Docker コンポーネントは、Dockerfile であり、docker build コマンドです。The Docker components that drive this automation are the Dockerfile, and the docker build command.

Dockerfile は新しいコンテナー イメージを作成するために必要な命令を含むテキスト ファイルです。The Dockerfile is a text file that contains the instructions needed to create a new container image. たとえば、ベースとして使用する既存のイメージの指定、イメージの作成プロセス時に実行されるコマンド、コンテナー イメージの新しいインスタンスが展開されるときに実行されるコマンドなどの命令が含まれます。These instructions include identification of an existing image to be used as a base, commands to be run during the image creation process, and a command that will run when new instances of the container image are deployed.

Docker ビルドは、Dockerfile を使用し、イメージ作成プロセスをトリガーする Docker エンジン コマンドです。Docker build is the Docker engine command that consumes a Dockerfile and triggers the image creation process.

このトピックでは、Windows コンテナーで Dockerfiles を使用する方法、基本構文を解釈する方法、および最も一般的な Dockerfiles 命令について説明します。This topic will show you how to use Dockerfiles with Windows containers, understand their basic syntax, and what the most common Dockerfile instructions are.

このドキュメントでは、コンテナー イメージとコンテナー イメージ レイヤーの概念について説明します。This document will discuss the concept of container images and container image layers. イメージとイメージレイヤーの詳細については、「コンテナーの基本イメージ」を参照してください。If you want to learn more about images and image layering, see container base images.

Dockerfile について詳しくは、Dockerfile リファレンスをご覧ください。For a complete look at Dockerfiles, see the Dockerfile reference.

基本構文Basic Syntax

ごく基本的なフォームでは、Dockerfile はとても単純です。In its most basic form, a Dockerfile can be very simple. 次の例では、IIS を含み、’hello world’ サイトを含む新しいイメージを作成します。The following example creates a new image, which includes IIS, and a ‘hello world’ site. この例に含まれるコマンド (# で示されます) については、各手順で説明します。This example includes comments (indicated with a #), that explain each step. この記事の以降のセクションでは、Dockerfile 構文規則と、Dockerfile 命令について詳しく説明します。Subsequent sections of this article will go into more detail on Dockerfile syntax rules, and Dockerfile instructions.

注意

Dockerfile は、拡張子は付けずに作成する必要があります。A Dockerfile must be created with no extension. Windows でこれを行うには、好みのエディターでファイルを作成し、"Dockerfile" という名前を使用してそのファイルを保存します (引用符も含めます)。To do this in Windows, create the file with your editor of choice, then save it with the notation "Dockerfile" (including the quotes).

# 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 のその他の例については、Dockerfiles for Windows レポジトリを参照してください。For additional examples of Dockerfiles for Windows, see the Dockerfile for Windows repository.

手順Instructions

Dockerfile 命令は、Docker エンジンに対して、コンテナー イメージを作成するために必要な手順を示します。Dockerfile instructions provide the Docker Engine the instructions it needs to create a container image. これら命令は、順番に、1 つずつ実行されます。These instructions are performed one-by-one and in order. 次の例は、Dockerfiles で最もよく使用される命令です。The following examples are the most commonly used instructions in Dockerfiles. Dockerfile 命令の完全な一覧については、Dockerfile リファレンスを参照してください。For a complete list of Dockerfile instructions, see the Dockerfile reference.

FROMFROM

FROM 命令では、新しいイメージ作成プロセス中に使用されるコンテナー イメージを設定します。The FROM instruction sets the container image that will be used during the new image creation process. たとえば、命令 FROM mcr.microsoft.com/windows/servercore を使用すると、結果のイメージは Windows Server Core ベース OS イメージから派生し、依存します。For instance, when using the instruction FROM mcr.microsoft.com/windows/servercore, the resulting image is derived from, and has a dependency on, the Windows Server Core base OS image. 指定したイメージが、Docker ビルド プロセスが実行されているシステムに存在しない場合、Docker エンジンは、パブリックまたはプライベートのイメージ レジストリからイメージのダウンロードを試行します。If the specified image is not present on the system where the Docker build process is being run, the Docker engine will attempt to download the image from a public or private image registry.

FROM 命令の形式は次のようになります。The FROM instruction's format goes like this:

FROM <image>

FROM コマンド構文の例を以下に示します。Here's an example of the FROM command:

Microsoft Container Registry (MCR) から ltsc2019 バージョンの Windows Server Core をダウンロードするには:To download the ltsc2019 version windows server core from the Microsoft Container Registry (MCR):

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

詳細については、「FROM リファレンス」を参照してください。For more detailed information, see the FROM reference.

RUNRUN

RUN 命令は、コマンドを実行し、新しいコンテナー イメージにキャプチャするように指定します。The RUN instruction specifies commands to be run, and captured into the new container image. これらのコマンドには、ソフトウェアのインストール、ファイルとディレクトリの作成、環境構成の作成などの項目が含まれます。These commands can include items such as installing software, creating files and directories, and creating environment configuration.

RUN 命令は次のようになります。The RUN instruction goes like this:

# exec form

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

# shell form

RUN <command>

exec とシェル形式間の違いは、RUN 命令の実行方法です。The difference between the exec and shell form is in how the RUN instruction is executed. exec フォームを使用すると、指定したプログラムが明示的に実行されます。When using the exec form, the specified program is run explicitly.

exec 形式の例を以下に示します。Here's an example of the exec form:

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

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

結果のイメージは、powershell New-Item c:/test コマンドを実行します。The resulting image runs the powershell New-Item c:/test command:

docker history doc-exe-method

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

対照的に、次の例では、同じ操作をシェル フォームで実行しています。To contrast, the following example runs the same operation in shell form:

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

RUN powershell New-Item c:\test

結果のイメージには、cmd /S /C powershell New-Item c:\test の実行命令があります。The resulting image has a run instruction of 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 での実行の使用に関する考慮事項Considerations for using RUN with Windows

Windows では、exec 形式で RUN 命令を使用する場合、バックスラッシュをエスケープする必要があります。On Windows, when using the RUN instruction with the exec format, backslashes must be escaped.

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

ターゲット プログラムが Windows インストーラーの場合は、/x:<directory> フラグを使用してセットアップを抽出してから、実際の (サイレント) インストール手順を実行する必要があります。When the target program is a Windows installer, you'll need to extract the setup through the /x:<directory> flag before you can launch the actual (silent) installation procedure. また、コマンドが終了するまで待ってから、他の操作を実行する必要があります。You must also wait for the command to exit before you do anything else. そうしないと、このプロセスは何もインストールせずに途中で終了してしまいます。Otherwise, the process will end prematurely without installing anything. 詳細については、次の例を参照してください。For details, please consult the example below.

Windows での RUN の使用例Examples of using RUN with Windows

この例では、Dockerfile が DISM を使用してコンテナー イメージに IIS をインストールします。The following example Dockerfile uses DISM to install IIS in the container image:

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

この例では、Visual Studio 再頒布可能パッケージをインストールします。This example installs the Visual Studio redistributable package. Start-Process-Wait パラメーターを使用を使用してインストーラーを実行します。Start-Process and the -Wait parameter are used to run the installer. これにより、Dockerfile の次の手順に進む前に、インストールを確実に完了することができます。This ensures that the installation completes before moving on to the next instruction in the Dockerfile.

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

RUN 命令の詳細については、RUN リファレンスを参照してください。For detailed information on the RUN instruction, see the RUN reference.

コピーCOPY

COPY 命令は、ファイルとディレクトリを、コンテナーのファイルシステムにコピーします。The COPY instruction copies files and directories to the container's file system. ファイルとディレクトリは、Dockerfile の相対パスで示す必要があります。The files and directories must be in a path relative to the Dockerfile.

COPY 命令の形式は次のようになります。The COPY instruction's format goes like this:

COPY <source> <destination>

送信元または送信先のいずれかに空白が含まれる場合は、次の例で示されるように、パスを角かっこと二重引用符で囲みます。If either source or destination includes white space, enclose the path in square brackets and double quotes, as shown in the following example:

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

Windows での COPY の使用に関する考慮事項Considerations for using COPY with Windows

Windows では、変換先形式でスラッシュを使用する必要があります。On Windows, the destination format must use forward slashes. たとえば、これらは有効な COPY 命令です。For example, these are valid COPY instructions:

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

一方、バックスラッシュ付きの次の形式は機能しません。Meanwhile, the following format with backslashes won't work:

COPY test1.txt c:\temp\

COPY を Windows で使用する例Examples of using COPY with Windows

この例では、ソース ディレクトリのコンテンツを、コンテナー イメージの sqllite というディレクトリに追加します。The following example adds the contents of the source directory to a directory named sqllite in the container image:

COPY source /sqlite/

この例では、config から始まるすべてのファイルを、コンテナー イメージの c:\temp ディレクトリに追加します。The following example will add all files that begin with config to the c:\temp directory of the container image:

COPY config* c:/temp/

COPY 命令の詳細については、COPY リファレンスをご覧ください。For more detailed information about the COPY instruction, see the COPY reference.

ADDADD

ADD 命令は COPY 命令に似ていますが、さらに多くの機能があります。The ADD instruction is like the COPY instruction, but with even more capabilities. ADD 命令は、ホストのファイルがコンテナー イメージにコピーされるだけでなく、リモートの場所にあるファイルを URL の仕様に対してコピーします。In addition to copying files from the host into the container image, the ADD instruction can also copy files from a remote location with a URL specification.

ADD 命令の形式は次のようになります。The ADD instruction's format goes like this:

ADD <source> <destination>

送信元または送信先のいずれかに空白が含まれる場合は、パスを角かっこと二重引用符で囲みます。If either the source or destination include white space, enclose the path in square brackets and double quotes:

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

Windows での ADD 実行に関する考慮事項Considerations for running ADD with Windows

Windows では、変換先形式でスラッシュを使用する必要があります。On Windows, the destination format must use forward slashes. たとえば、これらは有効な ADD 命令です。For example, these are valid ADD instructions:

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

一方、バックスラッシュ付きの次の形式は機能しません。Meanwhile, the following format with backslashes won't work:

ADD test1.txt c:\temp\

さらに、Linux の ADD 動作では、コンピューター上の圧縮されたパッケージを展開できます。Additionally, on Linux the ADD instruction will expand compressed packages on copy. この機能は、Windows ではこの機能を使用できません。This functionality is not available in Windows.

Windows での ADD の使用例Examples of using ADD with Windows

この例では、ソース ディレクトリのコンテンツを、コンテナー イメージの sqllite というディレクトリに追加します。The following example adds the contents of the source directory to a directory named sqllite in the container image:

ADD source /sqlite/

この例では、「config」から始まるすべてのファイルを、コンテナー イメージの c:\temp ディレクトリに追加します。The following example will add all files that begin with "config" to the c:\temp directory of the container image.

ADD config* c:/temp/

この例では、Windows 用 Python を、コンテナー イメージの c:\temp ディレクトリにダウンロードします。The following example will download Python for Windows into the c:\temp directory of the container image.

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

ADD 命令の詳細については、ADD リファレンスを参照してください。For more detailed information about the ADD instruction, see the ADD reference.

WORKDIRWORKDIR

WORKDIR 命令では、RUNCMD、コンテナー イメージのインスタンスを実行する作業ディレクトリなど、他の Dockerfile 命令の作業ディレクトリを設定します。The WORKDIR instruction sets a working directory for other Dockerfile instructions, such as RUN, CMD, and also the working directory for running instances of the container image.

WORKDIR 命令の形式は次のようになります。The WORKDIR instruction's format goes like this:

WORKDIR <path to working directory>

Windows で WORKDIR を使用する場合の考慮事項Considerations for using WORKDIR with Windows

Windows では、作業ディレクトリにバックスラッシュが含まれる場合、エスケープする必要があります。On Windows, if the working directory includes a backslash, it must be escaped.

WORKDIR c:\\windows

Examples

WORKDIR c:\\Apache24\\bin

WORKDIR 命令の詳細については、WORKDIR リファレンスを参照してください。For detailed information on the WORKDIR instruction, see the WORKDIR reference.

CMDCMD

CMD 命令では、コンテナー イメージのインスタンスを展開するときに実行する既定のコマンドを設定します。The CMD instruction sets the default command to be run when deploying an instance of the container image. たとえば、コンテナーが NGINX Web サーバーをホストする場合、CMD には、nginx.exe などコマンドを使用して、Web サーバーを起動する命令を含めることができます。For instance, if the container will be hosting an NGINX web server, the CMD might include instructions to start the web server with a command like nginx.exe. Dockerfile に複数の CMD 命令を指定すると、最後の命令のみが評価されます。If multiple CMD instructions are specified in a Dockerfile, only the last is evaluated.

CMD 命令の形式は次のようになります。The CMD instruction's format goes like this:

# exec form

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

# shell form

CMD <command>

Windows での CMD の使用に関する考慮事項Considerations for using CMD with Windows

Windows では、CMD 命令に指定されたファイル パスにはフォワード スラッシュを使用し、バックスラッシュをエスケープする (\\) 必要があります。On Windows, file paths specified in the CMD instruction must use forward slashes or have escaped backslashes \\. この例は有効な CMD 命令です。The following are valid CMD instructions:

# exec form

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

# shell form

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

ただし、適切なスラッシュのない次の形式は機能しません。However, the following format without the proper slashes will not work:

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

CMD 命令について詳しくは、CMD リファレンスをご覧ください。For more detailed information about the CMD instruction, see the CMD reference.

エスケープ文字Escape character

多くの場合、Dockerfile の命令は複数の行にまたがる必要があります。In many cases a Dockerfile instruction will need to span multiple lines. これを行うには、エスケープ文字を使用することができます。To do this, you can use an escape character. 既定の Dockerfile のエスケープ文字はバックスラッシュ \ です。The default Dockerfile escape character is a backslash \. ただし、バックスラッシュは Windows のファイルパスの区切り文字でもあるため、複数の行にまたがるようにこれ使用すると、問題が発生する可能性があります。However, because the backslash is also a file path separator in Windows, using it to span multiple lines can cause problems. これを回避するには、パーサー ディレクティブを使用して、既定のエスケープ文字を変更することもできます。To get around this, you can use a parser directive to change the default escape character. パーサー ディレクティブについて詳しくは、パーサー ディレクティブを参照してください。For more information about parser directives, see Parser directives.

次の例は、既定のエスケープ文字を使用した複数の行にまたがる単一の RUN 命令を示しています。The following example shows a single RUN instruction that spans multiple lines using the default escape character:

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 の最初の行に配置します。To modify the escape character, place an escape parser directive on the very first line of the Dockerfile. これは、次の例で確認できます。This can be seen in the following example.

注意

エスケープ文字として使用できる値は次の 2 つの値のみです。 \`Only two values can be used as escape characters: \ and `.

# 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

エスケープ パーサー ディレクティブについて詳しくは、エスケープ パーサー ディレクティブを参照してください。For more information about the escape parser directive, see Escape parser directive.

Dockerfile の PowerShellPowerShell in Dockerfile

PowerShell コマンドレットPowerShell cmdlets

PowerShell コマンドレットは、Dockerfile で RUN 操作を使用して実行できます。PowerShell cmdlets can be run in a Dockerfile with the RUN operation.

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

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

REST 呼び出しREST calls

PowerShell の Invoke-WebRequest コマンドレットは、Web サービスから情報やファイルを収集するときに便利です。PowerShell's Invoke-WebRequest cmdlet can be useful when gathering information or files from a web service. たとえば、Python を含むイメージをビルドする場合は、次の例に示すように、$ProgressPreferenceSilentlyContinue に設定すると、ダウンロードが高速になります。For instance, if you build an image that includes Python, you can set $ProgressPreference to SilentlyContinue to achieve faster downloads, as shown in the following example.

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 でも機能します。Invoke-WebRequest also works in Nano Server.

イメージの作成プロセス中にファイルをダウンロードするために PowerShell を使用するもう 1 つの方法として、.NET WebClient ライブラリを使う方法があります。Another option for using PowerShell to download files during the image creation process is to use the .NET WebClient library. この方法で、ダウンロードのパフォーマンスが向上します。This can increase download performance. 次の例では、WebClient ライブラリを使用して、Python ソフトウェアをダウンロードしています。The following example downloads the Python software, using the WebClient library.

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 をサポートしていません。Nano Server does not currently support WebClient.

Powershell スクリプトPowerShell scripts

場合によっては、イメージの作成プロセス中に使用されるコンテナーにスクリプトをコピーしてから、コンテナー内からそのスクリプトを実行する方法が便利なことがあります。In some cases, it may be helpful to copy a script into the containers you use during the image creation process, then run the script from within the container.

注意

この方法では、イメージ レイヤー キャッシュが制限され、Dockerfile の読みやすさが低下します。This will limit any image layer caching and decrease the Dockerfile's readability.

この例では、ADD 命令を使用して、ビルド コンピューターからコンテナーにスクリプトをコピーします。This example copies a script from the build machine into the container using the ADD instruction. このスクリプトは、RUN 命令を使用して実行されます。This script is then run using the RUN instruction.

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 のビルドDocker build

Dockerfile が作成され、ディスクに保存されると、docker build を実行して新しいイメージを作成できます。Once a Dockerfile has been created and saved to disk, you can run docker build to create the new image. docker build コマンドには、いくつかの省略可能なパラメーターと、Dockerfile のパスを指定できます。The docker build command takes several optional parameters and a path to the Dockerfile. すべてのビルド オプションの一覧を含め、Docker のビルドの詳細については、ビルドのレファレンスをご覧ください。For complete documentation on Docker Build, including a list of all build options, see the build reference.

docker build コマンドの形式は次のようになります。The format of the docker build command goes like this:

docker build [OPTIONS] PATH

たとえば、次のコマンドでは、’iis’ というイメージが作成されます。For example, the following command will create an image named "iis."

docker build -t iis .

ビルド プロセスが開始されると、出力に状態が示され、任意のスローされたエラーが返されます。When the build process has been initiated, the output will indicate status and return any thrown errors.

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’ というイメージです。The result is a new container image, which in this example is named "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

この後の参考資料Further reading and references