Saya baru ke dunia buruh pelabuhan. Saya harus menjalankan skrip shell yang mengambil argumen baris perintah melalui wadah buruh pelabuhan. Contoh: Skrip shell saya terlihat seperti:
#!bin/bash
echo $1
Dockerfile terlihat seperti ini:
FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh
Saya tidak yakin bagaimana menyampaikan argumen saat menjalankan wadah
bash
shell
docker
command-line-arguments
Akash Mehta
sumber
sumber
docker run -ti test /file.sh abc
. Saya merasa bahwa skrip tidak akan berjalan karena seharusnyadocker run -ti test sh /file.sh abc
. sh atau / bin / sh akan menjalankannya dengan benar.dengan skrip ini di
file.sh
dan ini
Dockerfile
kamu harus bisa:
sumber
ENTRYPOINT ./file.sh
chmod +x file.sh
untuk mengatur bendera yang dapat dieksekusi.["/file.sh"]
dan/file.sh
atau bahkan[/file.sh]
Dengan Docker, cara yang tepat untuk meneruskan informasi semacam ini adalah melalui variabel lingkungan.
Jadi dengan Dockerfile yang sama, ubah skrip menjadi
Setelah membangun, gunakan perintah buruh pelabuhan berikut:
sumber
Ada beberapa hal yang berinteraksi di sini:
docker run your_image arg1 arg2
akan mengganti nilaiCMD
denganarg1 arg2
. Itu pengganti CMD penuh, tidak menambahkan nilai lebih untuk itu. Inilah sebabnya mengapa Anda sering melihatdocker run some_image /bin/bash
untuk menjalankan bash shell di wadah.Ketika Anda memiliki nilai ENTRYPOINT dan CMD yang ditentukan, buruh pelabuhan memulai wadah dengan menggabungkan keduanya dan menjalankan perintah yang digabungkan itu. Jadi, jika Anda menetapkan entry point Anda menjadi
file.sh
, Anda sekarang dapat menjalankan wadah dengan args tambahan yang akan diteruskan sebagai argsfile.sh
.Entrypoint dan Perintah di buruh pelabuhan memiliki dua sintaks, sintaks string yang akan meluncurkan shell, dan sintaks json yang akan melakukan exec. Shell berguna untuk menangani hal-hal seperti pengalihan IO, merantai beberapa perintah secara bersamaan (dengan hal-hal seperti
&&
), substitusi variabel, dll. Namun, shell tersebut menghalangi penanganan sinyal (jika Anda pernah melihat penundaan 10 detik untuk berhenti sebuah wadah, ini sering penyebabnya) dan dengan menggabungkan titik masuk dan perintah bersama. Jika Anda mendefinisikan entrypoint Anda sebagai string, itu akan berjalan/bin/sh -c "file.sh"
, yang mana saja tidak masalah. Tetapi jika Anda memiliki perintah yang didefinisikan sebagai string juga, Anda akan melihat sesuatu seperti/bin/sh -c "file.sh" /bin/sh -c "arg1 arg2"
perintah yang diluncurkan di dalam wadah Anda, tidak begitu bagus. Lihat tabel di sini untuk informasi lebih lanjut tentang bagaimana dua opsi ini berinteraksi-c
Opsi shell hanya membutuhkan satu argumen. Segala sesuatu setelah itu akan diteruskan sebagai$1
,,$2
dll, ke argumen tunggal itu, tetapi tidak ke dalam skrip shell tertanam kecuali Anda secara eksplisit melewati argumen. Yaitu/bin/sh -c "file.sh $1 $2" "arg1" "arg2"
akan bekerja, tetapi/bin/sh -c "file.sh" "arg1" "arg2"
tidakfile.sh
akan karena akan dipanggil tanpa argumen.Secara keseluruhan, desain umum adalah:
Dan Anda kemudian menjalankannya dengan:
Ada detail yang lebih adil tentang ini di:
sumber
["bash", "--login", "-c"]
titik masuk saya untuk mendapatkan / etc / source profile di dalam gambar, tetapi kemudian bertanya-tanya mengapa tidak ada args yang diteruskan ke skrip shell yang diteruskan ke docker run ... Jawaban Anda menjelaskan, terima kasih !Apa yang saya miliki adalah file skrip yang benar-benar menjalankan sesuatu. File skrip ini mungkin relatif rumit. Sebut saja "run_container". Script ini mengambil argumen dari baris perintah:
Run_container sederhana mungkin:
Yang ingin saya lakukan adalah, setelah "meredam" ini saya ingin dapat memulai wadah ini dengan parameter pada baris perintah buruh pelabuhan seperti ini:
dan minta script run_container dijalankan dengan p1 p2 p3 sebagai parameter.
Ini solusi saya:
Dockerfile:
sumber
ENTRYPOINT
array dengan"/run_container \"$@\""
cara argumen yang berisi spasi ditangani dengan benar (misalnyadocker run image_name foo 'bar baz' quux
).Jika Anda ingin menjalankannya @build time:
jika Anda ingin menjalankannya @ run time:
Kemudian di shell host
sumber
ENTRYPOINT
adalah jawaban yang baik untuk OP yang saya pikir ingin runtime, tetapi jika Anda benar-benar ingin membangun variabel waktu, jawaban ini hanya rusak. GunakanARG
dandocker build --build-arg
docs.docker.com/engine/reference/builder/#argPilihan lain...
Untuk membuatnya bekerja
di dockerfile
di entrypoint.sh
sumber