Compartir a través de


Dockerfile en Windows

El motor de Docker incluye herramientas que automatizan la creación de imágenes de contenedor. Aunque puede crear imágenes de contenedor manualmente mediante la ejecución del comando docker commit, la adopción de un proceso de creación de imágenes automatizada tiene muchas ventajas, entre las que se incluyen:

  • Almacenamiento de imágenes de contenedor como código.
  • Recreación rápida y precisa de imágenes de contenedor con fines de mantenimiento y actualización.
  • Integración continua entre imágenes de contenedor y el ciclo de desarrollo.

Los componentes de Docker que controlan esta automatización son dockerfile y el comando docker build.

Dockerfile es un archivo de texto que contiene las instrucciones necesarias para crear una nueva imagen de contenedor. Estas instrucciones incluyen la identificación de una imagen existente que se usará como base, los comandos que se ejecutarán durante el proceso de creación de imágenes y un comando que se ejecutará cuando se implementen nuevas instancias de la imagen de contenedor.

Docker build es el comando del motor de Docker que consume un Dockerfile y desencadena el proceso de creación de una imagen.

En este tema se muestra cómo usar Dockerfiles con contenedores de Windows, comprender su sintaxis básica y cuáles son las instrucciones de Dockerfile más comunes.

En este documento se describe el concepto de imágenes de contenedor y capas de imagen de contenedor. Si quiere obtener más información sobre imágenes y capas de imágenes, veaImágenes base de contenedores.

Para tener una visión completa de los Dockerfiles, vea Referencia de Dockerfile.

Sintaxis básica

En su forma más básica, un Dockerfile puede ser muy sencillo. En el ejemplo siguiente se crea una nueva imagen, que incluye IIS y un sitio "hola mundo". En este ejemplo se incluyen comentarios (indicados con un #), que explican cada paso. En las secciones posteriores de este artículo se detallarán las reglas de sintaxis de Dockerfile y las instrucciones de Dockerfile.

Nota

Se debe crear un Dockerfile sin extensión. Para ello en Windows, cree el archivo con el editor que prefiera y guárdelo con la notación "Dockerfile" (incluidas las comillas).

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

A fin de obtener ejemplos adicionales de Dockerfiles para Windows, vea el repositorio de Dockerfile para Windows.

Instrucciones

Las instrucciones de Dockerfile proporcionan al motor de Docker las instrucciones que necesita para crear una imagen de contenedor. Estas instrucciones se realizan uno a uno y en orden. Los ejemplos siguientes son las instrucciones más usadas en Dockerfiles. Para obtener una lista completa de las instrucciones de Dockerfile, consulte la referencia de Dockerfile .

FROM

La FROM instrucción establece la imagen de contenedor que se usará durante el nuevo proceso de creación de imágenes. Por ejemplo, cuando se usa la instrucción FROM mcr.microsoft.com/windows/servercore, la imagen resultante se deriva de y tiene una dependencia de , la imagen del sistema operativo base de Windows Server Core. Si la imagen especificada no está presente en el sistema donde se ejecuta el proceso de compilación de Docker, el motor de Docker intentará descargar la imagen de un registro de imágenes público o privado.

El formato de la instrucción FROM es similar al siguiente:

FROM <image>

Este es un ejemplo del comando FROM:

Para descargar la versión ltsc2019 de Windows Server Core desde Microsoft Container Registry (MCR):

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

Para más información, vea la referencia de FROM.

RUN

La instrucción RUN especifica los comandos que se van a ejecutar y que se capturarán en la nueva imagen del contenedor. Estos comandos pueden incluir elementos como instalar software, crear archivos y directorios y crear la configuración del entorno.

La instrucción RUN es similar a la siguiente:

# exec form

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

# shell form

RUN <command>

La diferencia entre el formulario exec y shell es en cómo se ejecuta la instrucción RUN. Al usar el formulario exec, el programa especificado se ejecuta explícitamente.

Este es un ejemplo del formulario exec:

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

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

La imagen resultante ejecuta el 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

Por el contrario, en el ejemplo siguiente se ejecuta la misma operación en formato de shell:

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

RUN powershell New-Item c:\test

La imagen resultante tiene una instrucción de ejecución 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

Consideraciones para usar RUN con Windows

En Windows, al usar la instrucción RUN con el formato exec, se debe aplicar escape a las barras diagonales.

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

Cuando el programa de destino sea un instalador de Windows, deberá extraer la configuración a través de la marca /x:<directory> para poder iniciar el procedimiento de instalación real (silencioso). También debe esperar a que el comando termine antes de realizar cualquier otra operación. De lo contrario, el proceso finalizará prematuramente sin instalar nada. Para obtener más información, consulte el ejemplo siguiente.

Ejemplos de uso de RUN con Windows

En el ejemplo siguiente dockerfile se usa DISM para instalar IIS en la imagen de contenedor:

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

En este ejemplo se instala el paquete redistribuible de Visual Studio. Start-Process y el parámetro -Wait se usan para ejecutar el instalador. Esto garantiza que la instalación se complete antes de pasar a la siguiente instrucción en el Dockerfile.

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

Para obtener información detallada sobre la instrucción RUN, consulte la referencia RUN.

COPY

La instrucción COPY copia archivos y directorios en el sistema de archivos del contenedor. Los archivos y directorios deben estar en una ruta de acceso relativa al Dockerfile.

El formato de la instrucción COPY es similar al siguiente:

COPY <source> <destination>

Si el origen o el destino incluyen espacios en blanco, incluya la ruta de acceso entre corchetes y comillas dobles, como se muestra en el ejemplo siguiente:

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

Consideraciones para usar COPY con Windows

En Windows, el formato de destino debe usar barras diagonales. Por ejemplo, estas son instrucciones COPY válidas:

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

Por tanto, el siguiente formato con barras diagonales inversas no funcionará:

COPY test1.txt c:\temp\

Ejemplos de uso de COPY con Windows

En el ejemplo siguiente se agrega el contenido del directorio de origen a un directorio denominado sqllite en la imagen del contenedor:

COPY source /sqlite/

En el ejemplo siguiente se agregarán todos los archivos que comienzan con la configuración al directorio c:\temp de la imagen de contenedor:

COPY config* c:/temp/

Para obtener información más detallada sobre la instrucción de COPY, consulte la referencia de COPY.

AGREGAR

La instrucción ADD es como la instrucción COPY, pero con aún más funcionalidades. Además de copiar archivos del host en la imagen de contenedor, la instrucción ADD también puede copiar archivos desde una ubicación remota con una especificación de dirección URL.

El formato de la instrucción ADD es similar al siguiente:

ADD <source> <destination>

Si el origen o el destino incluyen espacios en blanco, incluya la ruta entre corchetes y comillas dobles:

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

Consideraciones para ejecutar ADD con Windows

En Windows, el formato de destino debe usar barras diagonales. Por ejemplo, estas son instrucciones ADD válidas:

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

Por tanto, el siguiente formato con barras diagonales inversas no funcionará:

ADD test1.txt c:\temp\

Además, en Linux, la instrucción ADD expandirá los paquetes comprimidos al copiar. Esta funcionalidad no está disponible en Windows.

Ejemplos de uso de ADD con Windows

En el ejemplo siguiente se agrega el contenido del directorio de origen a un directorio denominado sqllite en la imagen del contenedor:

ADD source /sqlite/

En el ejemplo siguiente se agregarán todos los archivos que comienzan por "config" al directorio c:\temp de la imagen de contenedor.

ADD config* c:/temp/

En el ejemplo siguiente se descargará Python para Windows en el directorio c:\temp de la imagen de contenedor.

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

Para más información sobre la instrucción ADD, vea la referencia de ADD.

WORKDIR

La instrucción WORKDIR establece un directorio de trabajo para otras instrucciones de Dockerfile, como RUN, CMDy también el directorio de trabajo para ejecutar instancias de la imagen de contenedor.

El formato de la instrucción WORKDIR es similar al siguiente:

WORKDIR <path to working directory>

Consideraciones para usar WORKDIR con Windows

En Windows, si el directorio de trabajo incluye una barra diagonal inversa, se le debe aplicar escape.

WORKDIR c:\\windows

Ejemplos

WORKDIR c:\\Apache24\\bin

Para obtener información detallada sobre la instrucción WORKDIR, consulte la referencia de WORKDIR.

CMD

La instrucción CMD establece que se ejecute el comando predeterminado al implementar una instancia de la imagen de contenedor. Por ejemplo, si el contenedor hospedará un servidor web NGINX, el CMD podría incluir instrucciones para iniciar el servidor web con un comando como nginx.exe. Si se especifican varias instrucciones CMD en un Dockerfile, solo se evalúa la última.

El formato de la instrucción CMD es similar al siguiente:

# exec form

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

# shell form

CMD <command>

Consideraciones para usar CMD con Windows

En Windows, las rutas de acceso de archivo especificadas en la instrucción CMD deben usar barras diagonales o tener barras diagonales inversas con escape \\. A continuación se muestran instrucciones CMD válidas:

# exec form

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

# shell form

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

Sin embargo, el siguiente formato sin las barras diagonales adecuadas no funcionará:

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

Para obtener información más detallada sobre la instrucción CMD, consulte la referencia de CMD de .

Carácter de escape

En muchos casos, una instrucción Dockerfile tendrá que abarcar varias líneas. Para ello, puede usar un carácter de escape. El carácter de escape predeterminado de Dockerfile es una barra diagonal inversa \. Sin embargo, dado que la barra diagonal inversa también es un separador de rutas de acceso de archivos en Windows, el hecho de usarla para abarcar varias líneas puede causar problemas. Para solucionar este problema, puede usar una directiva de analizador para cambiar el carácter de escape predeterminado. Para obtener más información sobre las directivas de analizador, consulte directivas de analizador.

En el ejemplo siguiente se muestra una única instrucción RUN que abarca varias líneas mediante el carácter de escape predeterminado:

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 el carácter de escape, coloque una directiva del analizador de escape en la primera línea del Dockerfile. Esto se puede ver en el ejemplo siguiente.

Nota

Solo se pueden usar dos valores como caracteres de escape: \ y `.

# 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 más información sobre la directiva del analizador de escape, vea Directiva del analizador de escape.

PowerShell en Dockerfile

Cmdlets de PowerShell

Los cmdlets de PowerShell se pueden ejecutar en un Dockerfile con la operación RUN.

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

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

Llamadas REST

El cmdlet Invoke-WebRequest de PowerShell puede ser útil al recopilar información o archivos de un servicio web. Por ejemplo, si crea una imagen que incluye Python, puede establecer $ProgressPreference en SilentlyContinue para lograr descargas más rápidas, como se muestra en el ejemplo siguiente.

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

Nota

Invoke-WebRequest también funciona en Nano Server.

Otra opción para usar PowerShell para descargar archivos durante el proceso de creación de imágenes es usar la biblioteca WebClient de .NET. Esto puede aumentar el rendimiento de la descarga. En el ejemplo siguiente se descarga el software de Python mediante la 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

Nota

Nano Server no admite actualmente WebClient.

Scripts de PowerShell

En algunos casos, puede resultar útil copiar un script en los contenedores que use durante el proceso de creación de imágenes y, a continuación, ejecutar el script desde dentro del contenedor.

Nota

Esto limitará el almacenamiento en caché de cualquier capa de imagen y reducirá la legibilidad de Dockerfile.

En este ejemplo se copia un script de la máquina de compilación en el contenedor mediante la instrucción ADD. A continuación, este script se ejecuta mediante la instrucción 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

Compilación de Docker

Una vez creado y guardado un Dockerfile en el disco, puede ejecutar docker build para crear la nueva imagen. El comando docker build toma varios parámetros opcionales y una ruta de acceso al Dockerfile. Para obtener documentación completa sobre La compilación de Docker, incluida una lista de todas las opciones de compilación, consulte la referencia de compilación .

El formato del comando docker build es similar al siguiente:

docker build [OPTIONS] PATH

Por ejemplo, el siguiente comando creará una imagen denominada "iis".

docker build -t iis .

Cuando se haya iniciado el proceso de compilación, la salida indicará el estado y devolverá los errores producidos.

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

El resultado es una nueva imagen de contenedor, que en este ejemplo se denomina "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

Lectura y referencias adicionales