Dockerfile'da bir komut dosyası çalıştırın


93

Dockerfile dosyamda oluşturma sürecim sırasında bir komut dosyası çalıştırmaya çalışıyorum. Ama işe yaramıyor gibi görünüyor.

Ben o şekilde denedim:

FROM php:7-fpm
ADD bootstrap.sh /
ENTRYPOINT ["/bin/bash", "/bootstrap.sh"]

Ayrıca bu şekilde:

FROM php:7-fpm    
ADD bootstrap.sh /
RUN bash -c "/bootstrap.sh"

Ve ayrıca çalışan kapsayıcımı çalıştırıyorum:

docker exec symfony /bin/bash -c "/bootstrap.sh"

Hiçbir şey işe yaramıyor gibi görünüyor.

Nasıl yapılacağını biliyor musun?


Does bootstarp.shçalıştırma iznine sahip?
jwodder

RUN chmod + x /bootstarp.sh gibi mi?
Kevin

2
"Çalışmıyor" ile tam olarak ne oluyor? Bir hata mı gösteriyor? Dosya görüntünün içinde mevcut mu? Eğer varsa docker exec -it symfony bashkonteynerin içinde, el komut dosyasını çalıştırın ve içeriğini kontrol edebilirsiniz? ( cat bootstarp.sh)?
thaJeztah

bunu deneyin: docker exec symfony /bin/bash /bootstarp.shve çıktıyı bana bildirin.
Boynux

12
Ermahgerd bootstarp!
Bruno Bronosky

Yanıtlar:


130

RUNve ENTRYPOINTbir komut dosyasını yürütmenin iki farklı yoludur.

RUNbir ara kap yarattığı, komut dosyasını çalıştırdığı ve bu kabın yeni durumunu yeni bir ara görüntüde dondurduğu anlamına gelir. Komut dosyası bundan sonra çalıştırılmayacaktır: son görüntünüz bu komut dosyasının sonucunu yansıtmalıdır.

ENTRYPOINT görüntünüzün (henüz komut dosyasını çalıştırmamış olan) bir kap oluşturacağı ve bu komut dosyasını çalıştıracağı anlamına gelir.

Her iki durumda da, komut dosyasının eklenmesi gerekir ve RUN chmod +x /bootstrap.sha iyi bir fikirdir.

Aynı zamanda bir shebang (gibi #!/bin/sh) ile başlamalı

Komut dosyanızı ( bootstarp.sh: birkaç git config --globalkomut) göz önünde bulundurarak, en iyisi RUNkomut dosyasını sizin için bir kez kullanmaktır Dockerfile, ancak doğru kullanıcıyı kullandığınızdan emin olun (global git configdosya, %HOME%/.gitconfigvarsayılan olarak /rootbiridir)

Dockerfile'ınıza ekleyin:

RUN /bootstart.sh

Ardından, bir kapsayıcı /root/.gitconfigçalıştırırken, komut dosyasının çalıştırıldığını doğrulamak için içeriğini kontrol edin .


5
Ayrıca, bootstrap.shbunun yerine şunu kastetmiş olabilirsiniz bootstarp.sh: stackoverflow.com/a/1254561/6309'a
VonC

Güzel! RUN /bootstrap.sh ile çok iyi çalışıyor
Kevin

1
İlk satırdaki mesele benim için yaptı, teşekkürler! :)
GDICommander

34

Yukarıdaki cevaplara ek olarak:

.Sh komut dosyanızı Windows'ta oluşturduysanız / düzenlediyseniz, Unix biçiminde biten satırla kaydedildiğinden emin olun . Varsayılan olarak, Windows'taki birçok düzenleyici Unix satır sonlarını Windows formatına dönüştürür ve Linux dosyanın başındaki shebang'ı (#! / Bin / sh) tanımaz. Yani Linux sanki bir shebang yokmuş gibi hata mesajı üretecektir.

İpuçları:

  • Notepad ++ kullanıyorsanız, "Edit / EOL Conversion / UNIX (LF)" seçeneğini tıklamanız gerekir
  • Visual Studio kullanıyorsanız, " Satır Sonu " eklentisini yüklemenizi öneririm . Ardından Ctrl-R, Ctrl-W tuşlarına basarak satır sonlarını görünür hale getirebilirsiniz. Linux stili sonları ayarlamak için Ctrl-R, Ctrl-L tuşlarına basabilirsiniz. Windows stili için Ctrl-R, Ctrl-C tuşlarına basın.

4
Vay canına, günümü kurtardın. Bunun için teşekkür ederim.
mw

2
Parlak! bu benim KESİN sorunumdu!
Kevinsyel

1
VSCode'um, bir kabuk betiğinin çizgili sonlarını pencerelerde CRLF'ye otomatik olarak ayarladı. Docker yapısı bazı rastgele karakterler nedeniyle başarısız oluyordu. VS Code'daki ayarları değiştirdim ve hemen çalışmaya başladı. Teşekkürler! Oy verdim.
Adithya Upadhya

24

ADDÇalışma dizininin komut ve belirtimiyle komut dosyası oluşturmaya çalışın Bunun gibi ("komut dosyası", komut dosyasının adıdır /root/script.shve kapsayıcıda istediğiniz yerdedir, farklı bir yol olabilir:

ADD script.sh /root/script.sh

Bu durumda ADDdaha önce CMDgelinmesi gerekir, eğer bir BTW'niz varsa, komut dosyalarını ana makineden konteynerdeki herhangi bir konuma aktarmanın harika bir yolu

In CMDyerde[./script]

Komut dosyanızı otomatik olarak yürütmelidir

Ayrıca belirtebilirsiniz WORKDIRolarak /roototomatik bir kap başlamasıyla birlikte, kök yerleştirilir you'l,


Docker, script.sh'nin ilk başta nerede olduğunu nasıl belirler? Demek istediğim, ilk parametrescript.sh
gün batımı

konteyner inşa ettiğiniz için, yolları yerleştirmekten de siz sorumlusunuz
Michael

İlk param yolu ve adı script.shgörelidirDockerfile
EJA

4

Yerel dosya sisteminden görüntüye kopyalarken kullanmak COPYyerine kullanmak en iyi uygulamadır ADD. Ayrıca, içeriğinizi yerleştirmek için bir alt klasör oluşturmanızı tavsiye ederim. Hiçbir şey değilse, her şeyi düzenli tutar. Komut dosyasını kullanarak çalıştırılabilir olarak işaretlediğinizden emin olun chmod.

Burada, scriptskomut dosyamı yerleştirmek ve buradan çalıştırmak için bir alt klasör oluşturuyorum :

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN script.sh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.