Aracılığıyla paylaş


Windows'da Dockerfile

Docker altyapısı, kapsayıcı görüntüsü oluşturmayı otomatik hale getiren araçlar içerir. docker commit komutunu çalıştırarak kapsayıcı görüntülerini el ile oluşturabilirsiniz ancak otomatik görüntü oluşturma işlemini benimsemenin aşağıdakiler gibi birçok avantajı vardır:

  • Kapsayıcı görüntülerini kod olarak depolama.
  • Bakım ve yükseltme amacıyla konteyner imajlarının hızlı ve doğru bir şekilde yeniden oluşturulması.
  • Geliştirme döngüsü ile kapsayıcı görüntüleri arasında sürekli entegrasyon.

Bu otomasyonu yönlendiren Docker bileşenleri Dockerfile ve docker build komutudır.

Dockerfile, yeni bir kapsayıcı görüntüsü oluşturmak için gereken yönergeleri içeren bir metin dosyasıdır. Bu yönergeler, temel olarak kullanılacak mevcut bir görüntünün tanımlanmasını, görüntü oluşturma işlemi sırasında çalıştırılacak komutları ve kapsayıcı görüntüsünün yeni örnekleri dağıtıldığında çalıştırılacak komutu içerir.

Docker derlemesi, Dockerfile kullanan ve görüntü oluşturma işlemini tetikleyen Docker altyapısı komutudur.

Bu konu başlığında Dockerfiles'ı Windows kapsayıcılarıyla kullanmayı, temel söz dizimlerini anlama ve en yaygın Dockerfile yönergelerinin ne olduğu gösterilir.

Bu belgede kapsayıcı görüntüleri ve kapsayıcı görüntüsü katmanları kavramı ele alınacaktır. Görüntüler ve görüntü katmanlama hakkında daha fazla bilgi edinmek istiyorsanız bkz. kapsayıcı taban görüntüleri.

Dockerfile'lara tam bir inceleme için bkz. Dockerfile referansı.

Temel Söz Dizimi

En temel biçimiyle Dockerfile çok basit olabilir. Aşağıdaki örnek, IIS ve 'merhaba dünya' sitesi içeren yeni bir görüntü oluşturur. Bu örnek, her adımı açıklayan açıklamaları (#ile gösterilir) içerir. Bu makalenin sonraki bölümlerinde Dockerfile söz dizimi kuralları ve Dockerfile yönergeleri hakkında daha ayrıntılı bilgi verilecektir.

Not

Uzantısız bir Dockerfile oluşturulmalıdır. Bunu Windows'ta yapmak için, dosyayı istediğiniz düzenleyiciyle oluşturun, ardından "Dockerfile" gösterimiyle (tırnak işaretleri dahil) kaydedin.

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

Windows için Dockerfile'lar ek örnekleri görmek için Windows için Dockerfile deposuna bakınız.

Talimatlar

Dockerfile yönergeleri, Docker Altyapısı'na kapsayıcı görüntüsü oluşturmak için gereken yönergeleri sağlar. Bu yönergeler tek tek ve sırayla gerçekleştirilir. Aşağıdaki örnekler Dockerfiles'da en yaygın kullanılan yönergelerdir. Dockerfile yönergelerinin tam listesi için Dockerfile referansınabakın.

KAYNAK

FROM yönergesi, yeni görüntü oluşturma işlemi sırasında kullanılacak kapsayıcı görüntüsünü ayarlar. Örneğin, FROM mcr.microsoft.com/windows/servercoreyönergesi kullanılırken, sonuçta elde edilen görüntü, Windows Server Core temel işletim sistemi görüntüsünden türetilir ve bir bağımlılığı vardır. Docker derleme işleminin çalıştırıldığı sistemde belirtilen görüntü yoksa, Docker altyapısı görüntüyü genel veya özel görüntü kayıt defterinden indirmeye çalışır.

FROM yönergesinin biçimi şöyledir:

FROM <image>

FROM komutunun bir örneği aşağıda verilmişti:

Microsoft Container Registry'den (MCR) ltsc2019 sürümü Windows Server Core'u indirmek için:

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

Daha ayrıntılı bilgi için FROM referansınabakın.

KOŞ

RUN yönergesi, çalıştırılacak ve yeni kapsayıcı görüntüsünde yakalanacak komutları belirtir. Bu komutlar yazılım yükleme, dosya ve dizin oluşturma ve ortam yapılandırması oluşturma gibi öğeleri içerebilir.

RUN yönergesi şöyle gider:

# exec form

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

# shell form

RUN <command>

exec ve komut satırı biçimi arasındaki fark, RUN yönergesinin nasıl yürütüldüğündedir. exec formu kullanılırken, belirtilen program açıkça çalıştırılır.

Aşağıda exec formunun bir örneği verilmişti:

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

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

Sonuçta elde edilen görüntü powershell New-Item c:/test komutunu çalıştırır:

docker history doc-exe-method

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

Karşıtlık için, aşağıdaki örnek kabuk biçiminde aynı işlemi çalıştırır:

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

RUN powershell New-Item c:\test

Sonuçta elde edilen görüntü, cmd /S /C powershell New-Item c:\testçalıştırma talimatı içerir.

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

Windows ile RUN kullanma konusunda dikkat edilmesi gerekenler

Windows'da, RUN yönergesini exec biçimiyle kullanırken ters eğik çizgilerden kaçınılmalıdır.

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

Hedef program bir Windows yükleyicisi olduğunda, gerçek (sessiz) yükleme prosedürünü başlatabilmeniz için önce kurulumu /x:<directory> bayrağı üzerinden çıkartmanız gerekir. Ayrıca, başka bir işlem gerçekleştirmeden önce komutun çıkışını beklemeniz gerekir. Aksi takdirde, işlem herhangi bir şey yüklemeden erken sona erer. Ayrıntılar için lütfen aşağıdaki örniğe bakın.

Windows ile RUN kullanma örnekleri

Aşağıdaki örnek Dockerfile, kapsayıcı görüntüsüne IIS yüklemek için DISM kullanır:

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

Bu örnek, Visual Studio yeniden dağıtılabilir paketini yükler. yükleyiciyi çalıştırmak için Start-Process ve -Wait parametresi kullanılır. Bu, Dockerfile'da sonraki yönergeye geçmeden önce yüklemenin tamamlanmasını sağlar.

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

RUN yönergesi hakkında ayrıntılı bilgi için, RUN başvurusunabakın.

Kopya

COPY yönergesi, dosyaları ve dizinleri kapsayıcının dosya sistemine kopyalar. Dosyalar ve dizinler, Dockerfile'a göre göreli bir yolda bulunmalıdır.

COPY yönergesinin biçimi şöyledir:

COPY <source> <destination>

Kaynak veya hedef boşluk içeriyorsa, aşağıdaki örnekte gösterildiği gibi yolu köşeli ayraçlar ve çift tırnak içine alın:

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

Windows ile COPY kullanma konusunda dikkat edilmesi gerekenler

Windows'da hedef biçimin ileri eğik çizgi kullanması gerekir. Örneğin, bunlar geçerli COPY yönergeleridir:

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

Bu arada, ters eğik çizgilerle aşağıdaki biçim çalışmaz:

COPY test1.txt c:\temp\

Windows ile COPY kullanma örnekleri

Aşağıdaki örnek, kaynak dizinin içeriğini kapsayıcı görüntüsündeki sqllite adlı dizine ekler:

COPY source /sqlite/

Aşağıdaki örnek, yapılandırma ile başlayan tüm dosyaları kapsayıcı görüntüsünün c:\temp dizinine ekler:

COPY config* c:/temp/

COPY yönergesi hakkında daha ayrıntılı bilgi için kopyalama referansınabakın.

EKLEMEK

ADD yönergesi COPY yönergesine benzer, ancak daha da fazla özelliğe sahiptir. ADD yönergesi, konaktan kapsayıcı görüntüsüne dosya kopyalamaya ek olarak, url belirtimi olan uzak bir konumdan da dosya kopyalayabilir.

ADD yönergesinin biçimi şöyledir:

ADD <source> <destination>

Kaynak veya hedef boşluk içeriyorsa, yolu köşeli parantezler ve çift tırnak işareti içine alın.

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

ADD'yi Windows ile çalıştırma konusunda dikkat edilmesi gerekenler

Windows'da hedef biçimin ileri eğik çizgi kullanması gerekir. Örneğin, bunlar geçerli ADD yönergeleridir:

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

Bu arada, ters eğik çizgilerle aşağıdaki biçim çalışmaz:

ADD test1.txt c:\temp\

Ayrıca Linux'ta ADD yönergesi kopyalanan sıkıştırılmış paketleri genişletir. Bu işlev Windows'ta kullanılamaz.

Add'i Windows ile kullanma örnekleri

Aşağıdaki örnek, kaynak dizinin içeriğini kapsayıcı görüntüsündeki sqllite adlı dizine ekler:

ADD source /sqlite/

Aşağıdaki örnek, kapsayıcı görüntüsünün c:\temp dizinine "config" ile başlayan tüm dosyaları ekler.

ADD config* c:/temp/

Aşağıdaki örnek, Windows için Python'ı kapsayıcı görüntüsünün c:\temp dizinine indirecektir.

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

ADD yönergesi hakkında daha ayrıntılı bilgi için ADD referansına bakın.

WORKDIR

WORKDIR yönergesi, RUN, CMDgibi diğer Dockerfile yönergeleri ve kapsayıcı görüntüsünün örneklerini çalıştırmak için çalışma dizini için bir çalışma dizini ayarlar.

WORKDIR yönergesinin biçimi şöyledir:

WORKDIR <path to working directory>

WorkDIR'i Windows ile kullanma konusunda dikkat edilmesi gerekenler

Windows'da, çalışma dizini ters eğik çizgi içeriyorsa, ters eğik çizgiden kaçılmalıdır.

WORKDIR c:\\windows

Örnekleri

WORKDIR c:\\Apache24\\bin

WORKDIR yönergesi hakkında ayrıntılı bilgi için bkz. WORKDIR referansı.

CMD

CMD yönergesi, kapsayıcı görüntüsünün bir örneğini dağıtırken çalıştırılacak varsayılan komutu ayarlar. Örneğin, kapsayıcı bir NGINX web sunucusu barındıracaksa, CMD web sunucusunu nginx.exegibi bir komutla başlatma yönergelerini içerebilir. Dockerfile'da birden çok CMD yönergesi belirtilirse, yalnızca sonuncusu değerlendirilir.

CMD yönergesinin biçimi şöyledir:

# exec form

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

# shell form

CMD <command>

Windows ile CMD kullanma konusunda dikkat edilmesi gerekenler

Windows'da, CMD yönergesinde belirtilen dosya yollarının eğik çizgi kullanması veya \\'de kaçış karakteri olarak ters eğik çizgi kullanılması gerekir. Geçerli CMD yönergeleri aşağıdadır:

# exec form

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

# shell form

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

Ancak, uygun eğik çizgi olmadan aşağıdaki biçim çalışmaz:

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

CMD yönergesi hakkında daha ayrıntılı bilgi için bkz. CMD başvurusu.

Kaçış karakteri

Çoğu durumda dockerfile yönergesi birden çok satıra yayılması gerekir. Bunu yapmak için bir kaçış karakteri kullanabilirsiniz. Varsayılan Dockerfile kaçış karakteri, \ters eğik çizgidir. Ancak, ters eğik çizgi aynı zamanda Windows'ta bir dosya yolu ayırıcısı olduğundan, birden çok satıra yaymak için kullanılması sorunlara neden olabilir. Bu sorunu çözmek için varsayılan kaçış karakterini değiştirmek için ayrıştırıcı yönergesi kullanabilirsiniz. Ayrıştırıcı yönergeleri hakkında daha fazla bilgi için bkz. Ayrıştırıcı yönergeleri.

Aşağıdaki örnekte, varsayılan kaçış karakteri kullanılarak birden çok satıra yayılan tek bir RUN yönergesi gösterilmektedir:

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

Kaçış karakterini değiştirmek için, Dockerfile dosyasının ilk satırına bir kaçış yorumlama yönergesi yerleştirin. Bu, aşağıdaki örnekte görülebilir.

Not

Kaçış karakteri olarak yalnızca iki değer kullanılabilir: \ ve `.

# 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

Kaçış ayrıştırıcı yönergesi hakkında daha fazla bilgi için bkz. Escape ayrıştırıcı yönergesi.

Dockerfile'da PowerShell

PowerShell cmdlet'leri

PowerShell cmdlet'leri RUN işlemiyle bir Dockerfile içinde çalıştırılabilir.

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

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

REST çağrıları

PowerShell'in Invoke-WebRequest cmdlet'i, bir web hizmetinden bilgi veya dosya toplarken yararlı olabilir. Örneğin, Python içeren bir görüntü oluşturursanız, aşağıdaki örnekte gösterildiği gibi daha hızlı indirmeler elde etmek için $ProgressPreferenceSilentlyContinue olarak ayarlayabilirsiniz.

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

Not

Invoke-WebRequest Nano Sunucu'da da çalışır.

Görüntü oluşturma işlemi sırasında dosyaları indirmek için PowerShell'i kullanmak için bir diğer seçenek de .NET WebClient kitaplığını kullanmaktır. Bu, indirme performansını artırabilir. Aşağıdaki örnek, WebClient kitaplığını kullanarak Python yazılımını indirir.

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

Not

Nano Sunucu şu anda WebClient'i desteklemiyor.

PowerShell betikleri

Bazı durumlarda, görüntü oluşturma işlemi sırasında kullandığınız kapsayıcılara bir betik kopyalamak ve ardından betiği kapsayıcı içinden çalıştırmak yararlı olabilir.

Not

Bu, herhangi bir görüntü katmanı önbelleğe almayı sınırlandırır ve Dockerfile'ın okunabilirliğini azaltır.

Örnek, derleme makinesinden kapsayıcıya bir betiği kopyalamak için ADD talimatını kullanır. Bu betik daha sonra RUN yönergesi kullanılarak çalıştırılır.

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 derlemesi

Dockerfile oluşturulduğunda ve diske kaydedildikten sonra yeni görüntüyü oluşturmak için docker build çalıştırabilirsiniz. docker build komutu birkaç isteğe bağlı parametreyi ve Dockerfile yolunu alır. Docker Oluşturma ile ilgili tüm belgeler için, tüm oluşturma seçeneklerinin listesini de içeren oluşturma başvurusuna bakın.

docker build komutunun biçimi şöyle olur:

docker build [OPTIONS] PATH

Örneğin, aşağıdaki komut "iis" adlı bir görüntü oluşturur.

docker build -t iis .

Derleme işlemi başlatıldığında, çıkış durumu gösterir ve oluşan hataları döndürür.

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

Sonuç, bu örnekte "iis" olarak adlandırılan yeni bir kapsayıcı görüntüsüdür.

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

Daha fazla okuma ve başvurular