Bagikan melalui


Dockerfile di Windows

Mesin Docker mencakup alat yang mengotomatiskan pembuatan gambar kontainer. Meskipun Anda dapat membuat gambar kontainer secara manual dengan menjalankan docker commit perintah, mengadopsi proses pembuatan gambar otomatis memiliki banyak manfaat, termasuk:

  • Menyimpan gambar kontainer sebagai kode.
  • Rekreasi gambar kontainer yang cepat dan tepat untuk tujuan pemeliharaan dan peningkatan.
  • Integrasi berkelanjutan antara gambar kontainer dan siklus pengembangan.

Komponen Docker yang mendorong otomatisasi ini adalah Dockerfile, dan docker build perintah .

Dockerfile adalah file teks yang berisi instruksi yang diperlukan untuk membuat gambar kontainer baru. Instruksi ini termasuk identifikasi gambar yang ada untuk digunakan sebagai dasar, perintah yang akan dijalankan selama proses pembuatan gambar, dan perintah yang akan berjalan ketika instans baru gambar kontainer disebarkan.

Build Docker adalah perintah mesin Docker yang menggunakan Dockerfile dan memicu proses pembuatan gambar.

Topik ini akan menunjukkan kepada Anda cara menggunakan Dockerfiles dengan kontainer Windows, memahami sintaks dasarnya, dan apa instruksi Dockerfile yang paling umum.

Dokumen ini akan membahas konsep gambar kontainer dan lapisan gambar kontainer. Jika Anda ingin mempelajari lebih lanjut tentang gambar dan lapisan gambar, lihat gambar dasar kontainer.

Untuk melihat secara lengkap Dockerfiles, lihat referensi Dockerfile.

Sintaks dasar

Dalam bentuk yang paling mendasar, Dockerfile bisa sangat sederhana. Contoh berikut membuat gambar baru, yang mencakup IIS, dan situs 'halo dunia'. Contoh ini mencakup komentar (ditunjukkan dengan #), yang menjelaskan setiap langkah. Bagian berikutnya dari artikel ini akan masuk ke detail selengkapnya tentang aturan sintaks Dockerfile, dan instruksi Dockerfile.

Catatan

Dockerfile harus dibuat tanpa ekstensi. Untuk melakukan ini di Windows, buat file dengan editor pilihan Anda, lalu simpan dengan notasi "Dockerfile" (termasuk tanda kutip).

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

Untuk contoh tambahan Dockerfiles untuk Windows, lihat repositori Dockerfile untuk Windows.

Petunjuk

Instruksi Dockerfile menyediakan Instruksi yang diperlukan Docker Engine untuk membuat gambar kontainer. Instruksi ini dilakukan satu per satu dan secara berurutan. Contoh berikut adalah instruksi yang paling umum digunakan di Dockerfiles. Untuk daftar lengkap instruksi Dockerfile, lihat referensi Dockerfile.

FROM

FROM Instruksi mengatur gambar kontainer yang akan digunakan selama proses pembuatan gambar baru. Misalnya, saat menggunakan instruksi FROM mcr.microsoft.com/windows/servercore, gambar yang dihasilkan berasal dari, dan memiliki dependensi pada, gambar OS dasar Windows Server Core. Jika gambar yang ditentukan tidak ada pada sistem tempat proses build Docker dijalankan, mesin Docker akan mencoba mengunduh gambar dari registri gambar publik atau privat.

Format instruksi FROM berjalan seperti ini:

FROM <image>

Berikut adalah contoh perintah FROM:

Untuk mengunduh inti server windows versi ltsc2019 dari Microsoft Container Registry (MCR):

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

Untuk informasi selengkapnya, lihat referensi FROM.

RUN

RUN Instruksi menentukan perintah yang akan dijalankan, dan diambil ke dalam gambar kontainer baru. Perintah ini dapat mencakup item seperti menginstal perangkat lunak, membuat file dan direktori, dan membuat konfigurasi lingkungan.

Instruksi RUN berjalan seperti ini:

# exec form

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

# shell form

RUN <command>

Perbedaan antara bentuk exec dan shell adalah bagaimana RUN instruksi dijalankan. Saat menggunakan formulir exec, program yang ditentukan dijalankan secara eksplisit.

Berikut adalah contoh formulir exec:

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

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

Gambar yang dihasilkan menjalankan powershell New-Item c:/test perintah:

docker history doc-exe-method

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

Sebaliknya, contoh berikut menjalankan operasi yang sama dalam bentuk shell:

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

RUN powershell New-Item c:\test

Gambar yang dihasilkan memiliki instruksi jalankan dari 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

Pertimbangan untuk menggunakan RUN dengan Windows

Pada Windows, saat menggunakan RUN instruksi dengan format exec, garis miring terbalik harus diloloskan.

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

Ketika program target adalah alat penginstal Windows, Anda harus mengekstrak penyiapan melalui /x:<directory> bendera sebelum Anda dapat meluncurkan prosedur penginstalan aktual (senyap). Anda juga harus menunggu perintah keluar sebelum melakukan hal lain. Jika tidak, prosesnya akan berakhir sebelum waktunya tanpa menginstal apa pun. Untuk detailnya, silakan lihat contoh di bawah ini.

Contoh penggunaan RUN dengan Windows

Contoh dockerfile berikut menggunakan DISM untuk menginstal IIS dalam gambar kontainer:

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

Contoh ini menginstal paket yang dapat didistribusikan ulang Visual Studio. Start-Process -Wait dan parameter digunakan untuk menjalankan alat penginstal. Ini memastikan bahwa penginstalan selesai sebelum melanjutkan ke instruksi berikutnya di Dockerfile.

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

Untuk informasi terperinci tentang instruksi RUN, lihat referensi RUN.

COPY

COPY Instruksi menyalin file dan direktori ke sistem file kontainer. File dan direktori harus berada di jalur yang relatif terhadap Dockerfile.

COPY Format instruksi berjalan seperti ini:

COPY <source> <destination>

Jika sumber atau tujuan menyertakan spasi kosong, sertakan jalur dalam tanda kurung siku dan tanda kutip ganda, seperti yang ditunjukkan dalam contoh berikut:

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

Pertimbangan untuk menggunakan COPY dengan Windows

Di Windows, format tujuan harus menggunakan garis miring ke depan. Misalnya, ini adalah instruksi yang valid COPY :

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

Sementara itu, format berikut dengan garis miring terbelakang tidak akan berfungsi:

COPY test1.txt c:\temp\

Contoh penggunaan COPY dengan Windows

Contoh berikut menambahkan konten direktori sumber ke direktori bernama sqllite dalam gambar kontainer:

COPY source /sqlite/

Contoh berikut akan menambahkan semua file yang dimulai dengan konfigurasi ke c:\temp direktori gambar kontainer:

COPY config* c:/temp/

Untuk informasi selengkapnya tentang COPY instruksi, lihat referensi COPY.

ADD

Instruksi ADD seperti instruksi COPY, tetapi dengan lebih banyak kemampuan. Selain menyalin file dari host ke dalam gambar kontainer, ADD instruksi juga dapat menyalin file dari lokasi jarak jauh dengan spesifikasi URL.

ADD Format instruksi berjalan seperti ini:

ADD <source> <destination>

Jika sumber atau tujuan menyertakan spasi kosong, sertakan jalur dalam tanda kurung siku dan tanda kutip ganda:

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

Pertimbangan untuk menjalankan ADD dengan Windows

Di Windows, format tujuan harus menggunakan garis miring ke depan. Misalnya, ini adalah instruksi yang valid ADD :

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

Sementara itu, format berikut dengan garis miring terbelakang tidak akan berfungsi:

ADD test1.txt c:\temp\

Selain itu, di Linux ADD instruksi akan memperluas paket terkompresi pada salinan. Fungsionalitas ini tidak tersedia di Windows.

Contoh penggunaan ADD dengan Windows

Contoh berikut menambahkan konten direktori sumber ke direktori bernama sqllite dalam gambar kontainer:

ADD source /sqlite/

Contoh berikut akan menambahkan semua file yang dimulai dengan "konfigurasi" ke c:\temp direktori gambar kontainer.

ADD config* c:/temp/

Contoh berikut akan mengunduh Python untuk Windows ke c:\temp direktori gambar kontainer.

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

Untuk informasi selengkapnya tentang ADD instruksi, lihat referensi ADD.

WORKDIR

WORKDIR Instruksi menetapkan direktori kerja untuk instruksi Dockerfile lainnya, seperti RUN, CMD, dan juga direktori kerja untuk menjalankan instans gambar kontainer.

WORKDIR Format instruksi berjalan seperti ini:

WORKDIR <path to working directory>

Pertimbangan untuk menggunakan WORKDIR dengan Windows

Di Windows, jika direktori kerja menyertakan garis miring terbalik, direktori tersebut harus diloloskan.

WORKDIR c:\\windows

Contoh

WORKDIR c:\\Apache24\\bin

Untuk informasi terperinci tentang WORKDIR instruksi, lihat referensi WORKDIR.

CMD

CMD Instruksi mengatur perintah default yang akan dijalankan saat menyebarkan instans gambar kontainer. Misalnya, jika kontainer akan menghosting server web NGINX, CMD mungkin menyertakan instruksi untuk memulai server web dengan perintah seperti nginx.exe. Jika beberapa CMD instruksi ditentukan dalam Dockerfile, hanya yang terakhir yang dievaluasi.

CMD Format instruksinya seperti ini:

# exec form

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

# shell form

CMD <command>

Pertimbangan untuk menggunakan CMD dengan Windows

Pada Windows, jalur file yang ditentukan dalam CMD instruksi harus menggunakan garis miring ke depan atau telah lolos dari garis miring terbelakang \\. Berikut ini adalah instruksi yang valid CMD :

# exec form

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

# shell form

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

Namun, format berikut tanpa garis miring yang tepat tidak akan berfungsi:

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

Untuk informasi selengkapnya tentang CMD instruksi, lihat referensi CMD.

Karakter escape

Dalam banyak kasus, instruksi Dockerfile perlu mencakup beberapa baris. Untuk melakukan ini, Anda dapat menggunakan karakter escape. Karakter escape Dockerfile default adalah garis miring terbelakang \. Namun, karena garis miring terbelakang juga merupakan pemisah jalur file di Windows, menggunakannya untuk menjangkau beberapa baris dapat menyebabkan masalah. Untuk mengatasinya, Anda dapat menggunakan direktif pengurai untuk mengubah karakter escape default. Untuk informasi selengkapnya tentang arahan pengurai, lihat Arahan Parser.

Contoh berikut menunjukkan satu instruksi RUN yang mencakup beberapa baris menggunakan karakter escape default:

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

Untuk memodifikasi karakter escape, tempatkan direktif pengurai escape pada baris pertama Dockerfile. Ini dapat dilihat dalam contoh berikut.

Catatan

Hanya dua nilai yang dapat digunakan sebagai karakter escape: \ dan `.

# 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

Untuk informasi selengkapnya tentang direktif pengurai escape, lihat Direktif pengurai escape.

PowerShell di Dockerfile

Cmdlet Powershell

Cmdlet PowerShell dapat dijalankan di Dockerfile dengan RUN operasi.

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

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

Panggilan REST

Cmdlet PowerShell Invoke-WebRequest dapat berguna saat mengumpulkan informasi atau file dari layanan web. Misalnya, jika Anda membuat gambar yang menyertakan Python, Anda dapat mengatur $ProgressPreference ke untuk SilentlyContinue mencapai unduhan yang lebih cepat, seperti yang ditunjukkan dalam contoh berikut.

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

Catatan

Invoke-WebRequest juga berfungsi di Nano Server.

Opsi lain untuk menggunakan PowerShell untuk mengunduh file selama proses pembuatan gambar adalah menggunakan pustaka .NET WebClient. Ini dapat meningkatkan performa unduhan. Contoh berikut mengunduh perangkat lunak Python, menggunakan pustaka 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

Catatan

Nano Server saat ini tidak mendukung WebClient.

Skrip PowerShell

Dalam beberapa kasus, mungkin berguna untuk menyalin skrip ke dalam kontainer yang Anda gunakan selama proses pembuatan gambar, lalu menjalankan skrip dari dalam kontainer.

Catatan

Ini akan membatasi penembolokan lapisan gambar apa pun dan mengurangi keterbacaan Dockerfile.

Contoh ini menyalin skrip dari mesin build ke dalam kontainer menggunakan ADD instruksi. Skrip ini kemudian dijalankan menggunakan instruksi 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

Build Docker

Setelah Dockerfile dibuat dan disimpan ke disk, Anda dapat menjalankan docker build untuk membuat gambar baru. Perintah docker build ini mengambil beberapa parameter opsional dan jalur ke Dockerfile. Untuk dokumentasi lengkap tentang Docker Build, termasuk daftar semua opsi build, lihat referensi build.

Format docker build perintah berjalan seperti ini:

docker build [OPTIONS] PATH

Misalnya, perintah berikut akan membuat gambar bernama "iis."

docker build -t iis .

Ketika proses build telah dimulai, output akan menunjukkan status dan mengembalikan kesalahan yang dilemparkan.

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

Hasilnya adalah gambar kontainer baru, yang dalam contoh ini diberi nama "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

Bacaan dan referensi lebih lanjut