Partilhar via


Dockerfile no Windows

O mecanismo do Docker inclui ferramentas que automatizam a criação de imagens de contêiner. Embora você possa criar imagens de contêiner manualmente executando o comando docker commit, adotar um processo automatizado de criação de imagens tem muitos benefícios, incluindo:

  • Armazenamento de imagens de contêiner como código.
  • Recriação rápida e precisa de imagens de contêiner para fins de manutenção e atualização.
  • Integração contínua entre imagens de contêiner e o ciclo de desenvolvimento.

Os componentes do Docker que conduzem essa automação são o Dockerfile e o comando docker build.

O Dockerfile é um arquivo de texto que contém as instruções necessárias para criar uma nova imagem de contêiner. Essas instruções incluem a identificação de uma imagem existente a ser usada como base, comandos a serem executados durante o processo de criação da imagem e um comando que será executado quando novas instâncias da imagem de contêiner forem implantadas.

A compilação do Docker é o comando do mecanismo do Docker que consome um Dockerfile e dispara o processo de criação da imagem.

Este tópico mostrará como usar Dockerfiles com contêineres do Windows, entender sua sintaxe básica e quais são as instruções mais comuns do Dockerfile.

Este documento discutirá o conceito de imagens de contêiner e camadas de imagem de contêiner. Se quiser saber mais sobre imagens e camadas de imagens, consulte imagens de base de contêiner.

Para obter uma visão completa sobre os Dockerfiles, consulte a referência do Dockerfile.

Sintaxe básica

Em sua forma mais básica, um Dockerfile pode ser muito simples. O exemplo a seguir cria uma nova imagem, que inclui o IIS, e um site 'hello world'. Este exemplo inclui comentários (indicados com um #), que explicam cada etapa. As seções subsequentes deste artigo entrarão em mais detalhes sobre as regras de sintaxe do Dockerfile e as instruções do Dockerfile.

Observação

Um Dockerfile deve ser criado sem extensão. Para fazer isso no Windows, crie o arquivo com seu editor de escolha e, em seguida, salve-o com a notação "Dockerfile" (incluindo as aspas).

# 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" ]

Para obter exemplos adicionais de Dockerfiles para Windows, consulte o repositório Dockerfile for Windows.

Instruções

As instruções do Dockerfile fornecem ao Docker Engine as instruções necessárias para criar uma imagem de contêiner. Estas instruções são executadas uma a uma e em ordem. Os exemplos a seguir são as instruções mais usadas no Dockerfiles. Para obter uma lista completa das instruções do Dockerfile, consulte a referência do Dockerfile .

DE

A instrução FROM define a imagem de contêiner que será usada durante o processo de criação da nova imagem. Por exemplo, ao usar a instrução FROM mcr.microsoft.com/windows/servercore, a imagem resultante é derivada de e depende da imagem do sistema operativo base do Windows Server Core. Se a imagem especificada não estiver presente no sistema em que o processo de compilação do Docker está sendo executado, o mecanismo do Docker tentará baixar a imagem de um registro de imagem público ou privado.

O formato da instrução FROM é assim:

FROM <image>

Aqui está um exemplo do comando FROM:

Para baixar a versão LTSC2019 do Windows Server Core do Microsoft Container Registry (MCR):

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

Para obter informações mais detalhadas, consulte a referência a partir de.

Corre!

A instrução RUN especifica os comandos a serem executados e capturados na nova imagem de contêiner. Esses comandos podem incluir itens como a instalação de software, a criação de arquivos e diretórios e a criação de configurações de ambiente.

A instrução RUN é assim:

# exec form

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

# shell form

RUN <command>

A diferença entre o formulário exec e shell está em como a instrução RUN é executada. Ao usar o formulário exec, o programa especificado é executado explicitamente.

Aqui está um exemplo do formulário exec:

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

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

A imagem resultante executa o comando 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

Para contrastar, o exemplo a seguir executa a mesma operação em forma de shell:

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

RUN powershell New-Item c:\test

A imagem resultante tem uma instrução de execução de 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

Considerações para usar RUN com o Windows

No Windows, ao usar a instrução RUN com o formato exec, as barras invertidas devem ser escapadas.

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

Quando o programa de destino é um instalador do Windows, você precisará extrair a instalação através do sinalizador /x:<directory> antes de iniciar o procedimento de instalação real (silencioso). Você também deve esperar que o comando saia antes de fazer qualquer outra coisa. Caso contrário, o processo terminará prematuramente sem instalar nada. Para mais detalhes, consulte o exemplo abaixo.

Exemplos de utilização de RUN com o Windows

O exemplo a seguir Dockerfile usa o DISM para instalar o IIS na imagem do contêiner:

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

Este exemplo instala o pacote redistribuível do Visual Studio. Start-Process e o parâmetro -Wait são usados para executar o instalador. Isso garante que a instalação seja concluída antes de passar para a próxima instrução no Dockerfile.

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

Para obter informações detalhadas sobre a instrução RUN, consulte a referência RUN .

CÓPIA

A instrução COPY copia arquivos e diretórios para o sistema de arquivos do contêiner. Os arquivos e diretórios devem estar em um caminho relativo ao Dockerfile.

O formato da instrução COPY é assim:

COPY <source> <destination>

Se a origem ou o destino incluir espaço em branco, coloque o caminho entre colchetes e aspas duplas, conforme mostrado no exemplo a seguir:

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

Considerações sobre o uso do COPY com o Windows

No Windows, o formato de destino deve usar barras. Por exemplo, estas são instruções COPY válidas:

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

Enquanto isso, o seguinte formato com barras invertidas não funcionará:

COPY test1.txt c:\temp\

Exemplos de utilização do COPY com o Windows

O exemplo a seguir adiciona o conteúdo do diretório de origem a um diretório chamado sqllite na imagem do contêiner:

COPY source /sqlite/

O exemplo a seguir adicionará todos os arquivos que começam com config ao diretório c:\temp da imagem do contêiner:

COPY config* c:/temp/

Para obter informações mais detalhadas sobre a instrução COPY, consulte a referência COPY.

ADICIONAR

A instrução ADD é como a instrução COPY, mas com ainda mais recursos. Além de copiar arquivos do host para a imagem do contêiner, a instrução ADD também pode copiar arquivos de um local remoto com uma especificação de URL.

O formato da instrução ADD é assim:

ADD <source> <destination>

Se a origem ou o destino incluírem espaço em branco, coloque o caminho entre colchetes e aspas duplas:

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

Considerações para executar o ADD com o Windows

No Windows, o formato de destino deve usar barras. Por exemplo, estas são instruções ADD válidas:

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

Enquanto isso, o seguinte formato com barras invertidas não funcionará:

ADD test1.txt c:\temp\

Além disso, no Linux, a instrução ADD expandirá os pacotes compactados na cópia. Esta funcionalidade não está disponível no Windows.

Exemplos de utilização do ADD com o Windows

O exemplo a seguir adiciona o conteúdo do diretório de origem a um diretório chamado sqllite na imagem do contêiner:

ADD source /sqlite/

O exemplo a seguir adicionará todos os arquivos que começam com "config" ao diretório c:\temp da imagem do contêiner.

ADD config* c:/temp/

O exemplo a seguir baixará o Python para Windows no diretório c:\temp da imagem do contêiner.

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

Para obter informações mais detalhadas sobre a instrução ADD, consulte a referência sobre ADD.

WORKDIR

A instrução WORKDIR define um diretório de trabalho para outras instruções do Dockerfile, como RUN, CMDe também o diretório de trabalho para executar instâncias da imagem de contêiner.

O formato da instrução WORKDIR é assim:

WORKDIR <path to working directory>

Considerações sobre o uso do WORKDIR com o Windows

No Windows, se o diretório de trabalho incluir uma barra invertida, ela deverá ser escapada.

WORKDIR c:\\windows

Exemplos

WORKDIR c:\\Apache24\\bin

Para obter informações detalhadas sobre a instrução WORKDIR, consulte a referência WORKDIR.

CMD

A instrução CMD define o comando padrão a ser executado ao implantar uma instância da imagem de contêiner. Por exemplo, se o contêiner estiver hospedando um servidor Web NGINX, o CMD pode incluir instruções para iniciar o servidor Web com um comando como nginx.exe. Se várias instruções de CMD forem especificadas em um Dockerfile, somente a última será avaliada.

O formato da instrução CMD é assim:

# exec form

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

# shell form

CMD <command>

Considerações sobre o uso do CMD com o Windows

No Windows, os caminhos de ficheiro especificados na instrução CMD devem usar barras normais ou usar barras invertidas escapadas \\. As instruções CMD válidas são as seguintes:

# exec form

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

# shell form

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

No entanto, o seguinte formato sem as barras adequadas não funcionará:

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

Para obter informações mais detalhadas sobre a instrução CMD, consulte o de referência CMD.

Personagem de fuga

Em muitos casos, uma instrução do Dockerfile precisará abranger várias linhas. Para fazer isso, você pode usar um personagem de fuga. O caractere de escape padrão do Dockerfile é uma barra invertida \. No entanto, como a barra invertida também é um separador de caminho de ficheiro no Windows, usá-la para dividir texto em várias linhas pode causar problemas. Para contornar isso, você pode usar uma diretiva de analisador para alterar o caractere de escape padrão. Para obter mais informações sobre diretivas de analisador, consulte diretivas de analisador.

O exemplo a seguir mostra uma única instrução RUN que abrange várias linhas usando o caractere de escape padrão:

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

Para modificar o caractere de escape, coloque uma diretiva do analisador de escape na primeira linha do Dockerfile. Isso pode ser visto no exemplo a seguir.

Observação

Apenas dois valores podem ser usados como caracteres de escape: \ e `.

# 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

Para obter mais informações sobre a diretiva do analisador de escape, consulte .

PowerShell no Dockerfile

Cmdlets do PowerShell

Os cmdlets do PowerShell podem ser executados em um Dockerfile com a operação RUN.

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

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

Chamadas REST

O cmdlet Invoke-WebRequest do PowerShell pode ser útil ao coletar informações ou arquivos de um serviço Web. Por exemplo, se você criar uma imagem que inclua Python, poderá definir $ProgressPreference como SilentlyContinue para obter downloads mais rápidos, conforme mostrado no exemplo a seguir.

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

Observação

Invoke-WebRequest também funciona no Nano Server.

Outra opção para usar o PowerShell para baixar arquivos durante o processo de criação de imagem é usar a biblioteca .NET WebClient. Isso pode aumentar o desempenho do download. O exemplo a seguir baixa o software Python, usando a biblioteca WebClient.

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

Observação

Nano Server atualmente não suporta WebClient.

Scripts do PowerShell

Em alguns casos, pode ser útil copiar um script para os contêineres que você usa durante o processo de criação da imagem e, em seguida, executar o script de dentro do contêiner.

Observação

Isso limitará qualquer cache de camada de imagem e diminuirá a legibilidade do Dockerfile.

Este exemplo copia um script da máquina de compilação para o contêiner usando a instrução ADD. Esse script é então executado usando a instrução 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

Compilação do Docker

Depois que um Dockerfile tiver sido criado e salvo no disco, você poderá executádocker build para criar a nova imagem. O comando docker build usa vários parâmetros opcionais e um caminho para o Dockerfile. Para obter a documentação completa sobre o Docker Build, incluindo uma lista de todas as opções de compilação, consulte a referência de compilação .

O formato do comando docker build é assim:

docker build [OPTIONS] PATH

Por exemplo, o comando a seguir criará uma imagem chamada "iis".

docker build -t iis .

Quando o processo de compilação tiver sido iniciado, a saída indicará o status e retornará quaisquer erros lançados.

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

O resultado é uma nova imagem de contêiner, que neste exemplo é chamada de "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

Outras leituras e referências