Jalankan skrip di Dockerfile

93

Saya mencoba menjalankan skrip selama proses pembangunan saya di Dockerfile saya. Tapi sepertinya tidak berhasil.

Saya mencoba seperti itu:

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

Juga begini:

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

Dan juga menjalankan container saya yang sedang berjalan:

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

Sepertinya tidak ada yang berhasil.

Tahukah Anda bagaimana melakukannya?

Kevin
sumber
Apakah bootstarp.shmemiliki bit yang dapat dieksekusi?
jwodder
Seperti itu JALANKAN chmod + x /bootstarp.sh?
Kevin
2
Dengan "tidak berfungsi", apa sebenarnya yang terjadi? Apakah itu menunjukkan kesalahan? Apakah file ada di dalam gambar? Jika Anda docker exec -it symfony bashberada di dalam penampung, dapatkah Anda menjalankan skrip secara manual, dan memeriksa isinya? ( cat bootstarp.sh)?
thaJeztah
coba ini: docker exec symfony /bin/bash /bootstarp.shdan beri tahu saya hasilnya.
Boynux
12
Ermahgerd bootstarp!
Bruno Bronosky

Jawaban:

128

RUNdan ENTRYPOINTdua cara berbeda untuk menjalankan skrip.

RUNberarti itu membuat penampung perantara, menjalankan skrip dan membekukan status baru penampung itu dalam gambar perantara baru. Skrip tidak akan dijalankan setelah itu: gambar akhir Anda seharusnya mencerminkan hasil dari skrip itu.

ENTRYPOINT berarti gambar Anda (yang belum mengeksekusi skrip) akan membuat wadah, dan menjalankan skrip tersebut.

Dalam kedua kasus tersebut, skrip perlu ditambahkan, dan a RUN chmod +x /bootstrap.shadalah ide yang bagus.

Ini juga harus dimulai dengan shebang (seperti #!/bin/sh)

Mempertimbangkan skrip Anda ( bootstarp.sh: beberapa git config --globalperintah), akan lebih baik menggunakan RUNskrip itu sekali di Anda Dockerfile, tetapi pastikan untuk menggunakan pengguna yang tepat ( git configfile global %HOME%/.gitconfig, yang secara default adalah /rootsatu - satunya)

Tambahkan ke Dockerfile Anda:

RUN /bootstart.sh

Kemudian, saat menjalankan penampung, periksa konten /root/.gitconfiguntuk mengonfirmasi bahwa skrip telah dijalankan.

VonC
sumber
5
Selain itu, Anda mungkin bermaksud bootstrap.shselain bootstarp.sh: lihat stackoverflow.com/a/1254561/6309
VonC
Keren! Bekerja sangat baik dengan RUN /bootstrap.sh
Kevin
1
Shebang di baris pertama melakukannya untuk saya, terima kasih! :)
GDICommander
34

Selain jawaban di atas:

Jika Anda membuat / mengedit file skrip .sh Anda di Windows, pastikan file tersebut disimpan dengan baris yang diakhiri dengan format Unix . Secara default banyak editor di Windows akan mengubah akhiran baris Unix ke format Windows dan Linux tidak akan mengenali shebang (#! / Bin / sh) di awal file. Jadi Linux akan menghasilkan pesan error seperti jika tidak ada shebang.

Tips:

  • Jika Anda menggunakan Notepad ++, Anda perlu mengklik "Edit / EOL Conversion / UNIX (LF)"
  • Jika Anda menggunakan Visual Studio, saya sarankan menginstal plugin " End Of Line ". Kemudian Anda dapat membuat akhir baris terlihat dengan menekan Ctrl-R, Ctrl-W. Dan untuk mengatur akhiran gaya Linux Anda dapat menekan Ctrl-R, Ctrl-L. Untuk gaya Windows, tekan Ctrl-R, Ctrl-C.
VeganHunter
sumber
4
Wow, kamu menyelamatkan hariku. Terima kasih untuk ini.
mw
2
Cemerlang! ini adalah masalah saya PERSIS!
Kevinsyel
1
VSCode saya telah secara otomatis menetapkan ujung berjajar skrip shell ke CRLF di windows. Build buruh pelabuhan gagal karena beberapa karakter acak. Saya mengubah pengaturan di VS Code dan segera mulai bekerja. Terima kasih! Saya telah memberi suara positif.
Adithya Upadhya
24

Cobalah untuk membuat skrip dengan ADDperintah dan spesifikasi direktori kerja Seperti ini ("skrip" adalah nama skrip dan /root/script.shberada di tempat yang Anda inginkan dalam wadah, jalurnya dapat berbeda:

ADD script.sh /root/script.sh

Dalam hal ADDini harus datang sebelumnya CMD, jika Anda memiliki satu BTW, cara yang keren untuk mengimpor skrip ke lokasi mana pun dalam wadah dari mesin host

Di CMDtempat[./script]

Ini harus secara otomatis menjalankan skrip Anda

Anda juga dapat menentukan WORKDIRsebagai /root, lalu Anda akan otomatis ditempatkan di root, saat memulai penampung

Michael
sumber
Bagaimana buruh pelabuhan mengidentifikasi di mana script.sh berada pada awalnya? Maksud saya, parameter pertama,script.sh
matahari terbenam
karena Anda sedang membangun kontainer, Anda juga bertanggung jawab untuk menempatkan jalur
Michael
jalur dan nama param pertama script.shrelatif terhadapDockerfile
eja
4

Ini praktik terbaik untuk digunakan COPYdaripada ADDsaat Anda menyalin dari sistem file lokal ke gambar. Juga, saya akan merekomendasikan membuat sub-folder untuk menempatkan konten Anda. Jika tidak ada yang lain, itu membuat semuanya rapi. Pastikan Anda menandai skrip sebagai dapat dieksekusi menggunakan chmod.

Di sini, saya membuat scriptssub-folder untuk menempatkan skrip saya dan menjalankannya dari:

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN script.sh
ldobson
sumber