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