Baca dalam bahasa Inggris

Bagikan melalui


Dockerfile di Windows

Mesin Docker mencakup alat yang mengotomatiskan pembuatan gambar kontainer. Meskipun Anda dapat membuat gambar kontainer secara manual dengan menjalankan perintah docker commit, 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 perintah docker build.

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.

Docker build adalah perintah mesin Docker yang memanfaatkan Dockerfile dan memicu proses pembuatan citra.

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 panduan lengkap tentang Dockerfiles, lihat referensi Dockerfile .

Sintaks Dasar

Dalam bentuknya 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).

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

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

Peraturan

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

DARI

Instruksi FROM 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:

Dockerfile
FROM <image>

Berikut adalah contoh perintah FROM:

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

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

Untuk informasi lebih rinci, lihat referensi dari.

LARI

Instruksi RUN 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:

Dockerfile
# exec form

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

# shell form

RUN <command>

Perbedaan antara bentuk exec dan shell adalah bagaimana instruksi RUN 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 perintah powershell New-Item c:/test:

Dockerfile
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 eksekusi cmd /S /C powershell New-Item c:\test.

Dockerfile
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 perintah RUN dengan format exec, backslash harus di-escape.

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

Ketika program target adalah instalasi Windows, Anda harus mengekstrak setup melalui bendera /x:<directory> sebelum Anda bisa memulai prosedur instalasi yang sebenarnya (diam-diam). Anda juga harus menunggu perintah keluar sebelum melakukan hal lain. Jika tidak, proses 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:

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

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

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

Untuk informasi terperinci tentang instruksi RUN, lihat referensi run .

MENYALIN

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

Format instruksi COPY seperti ini:

Dockerfile
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:

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

Pertimbangan untuk menggunakan COPY dengan Windows

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

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

Sementara itu, format berikut dengan garis miring terbalik tidak akan berfungsi.

Dockerfile
COPY test1.txt c:\temp\

Contoh penggunaan COPY dengan Windows

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

Dockerfile
COPY source /sqlite/

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

Dockerfile
COPY config* c:/temp/

Untuk informasi selengkapnya tentang instruksi COPY, lihat referensi COPY.

TAMBAH

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

Format instruksi ADD seperti ini:

Dockerfile
ADD <source> <destination>

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

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

Pertimbangan untuk menjalankan ADD dengan Windows

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

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

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

Dockerfile
ADD test1.txt c:\temp\

Selain itu, di Linux instruksi ADD 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:

Dockerfile
ADD source /sqlite/

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

Dockerfile
ADD config* c:/temp/

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

Dockerfile
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 instruksi ADD, lihat referensi ADD.

WORKDIR

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

Format instruksi WORKDIR seperti ini:

Dockerfile
WORKDIR <path to working directory>

Pertimbangan untuk menggunakan WORKDIR dengan Windows

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

Dockerfile
WORKDIR c:\\windows

Contoh

Dockerfile
WORKDIR c:\\Apache24\\bin

Untuk informasi terperinci tentang instruksi WORKDIR, lihat referensi WORKDIR.

CMD

Instruksi CMD 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 instruksi CMD ditentukan dalam Dockerfile, hanya yang terakhir yang dievaluasi.

Format instruksi CMD seperti ini:

Dockerfile
# exec form

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

# shell form

CMD <command>

Pertimbangan untuk menggunakan CMD dengan Windows

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

Dockerfile
# 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:

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

Untuk informasi selengkapnya tentang instruksi CMD, 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 terbalik \. Namun, karena backslash juga merupakan pemisah jalur file di Windows, menggunakannya dalam beberapa baris dapat menyebabkan masalah. Untuk mengatasi hal ini, Anda dapat menggunakan direktif pengurai untuk mengubah karakter escape default. Untuk informasi selengkapnya tentang arahan pengurai, lihat direktif 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, letakkan direktif pengurai escape pada baris pertama Dockerfile. Ini dapat dilihat dalam contoh berikut.

Catatan

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

Dockerfile
# 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 arahan pengurai escape, lihat direktif pengurai Escape .

PowerShell di Dockerfile

Cmdlet PowerShell

Cmdlet PowerShell dapat dijalankan dalam Dockerfile dengan operasi RUN.

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

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

Panggilan REST

Cmdlet Invoke-WebRequest PowerShell dapat berguna saat mengumpulkan informasi atau file dari layanan web. Misalnya, jika Anda membuat gambar yang menyertakan Python, Anda dapat mengatur $ProgressPreference ke SilentlyContinue untuk 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 dan mengurangi keterbacaan Dockerfile.

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

Docker build

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

Format perintah docker build berjalan seperti ini:

Dockerfile
docker build [OPTIONS] PATH

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

Dockerfile
docker build -t iis .

Ketika proses pembangunan telah dimulai, output akan menunjukkan status dan mengembalikan kesalahan yang muncul.

Dockerfile
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."

Dockerfile
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