buruh pelabuhan menjalankan <IMAGE> <COMMANDS MULTIPLE>

255

Saya mencoba menjalankan perintah GANDA seperti ini.

docker run image cd /path/to/somewhere && python a.py

Tapi ini memberi saya kesalahan "Tidak ada file atau direktori" karena ditafsirkan sebagai ...

"docker run image cd /path/to/somewhere" && "python a.py"

Tampaknya beberapa karakter ESCAPE seperti "" atau () diperlukan.

Jadi saya juga mencoba

docker run image "cd /path/to/somewhere && python a.py"
docker run image (cd /path/to/somewhere && python a.py)

tetapi ini tidak berhasil.

Saya telah mencari Referensi Docker Run tetapi belum menemukan petunjuk tentang karakter ESCAPE.

ai0307
sumber

Jawaban:

440

Untuk menjalankan banyak perintah di buruh pelabuhan, gunakan /bin/bash -cdan titik koma;

docker run image_name /bin/bash -c "cd /path/to/somewhere; python a.py"

Jika kita membutuhkan command2 (python) akan dieksekusi jika dan hanya jika command1 (cd) mengembalikan status keluar nol (tidak ada kesalahan), gunakan &&alih-alih;

docker run image_name /bin/bash -c "cd /path/to/somewhere && python a.py"
anhlc
sumber
Terima kasih atas petunjuknya! Saya hanya mencoba [buruh pelabuhan menjalankan gambar "cd / bin; ls"] dan mendapat pesan kesalahan berikut. [exec: "cd / bin; ls": stat cd / bin; ls: tidak ada file atau direktori seperti itu] [Respons kesalahan dari daemon: Tidak dapat memulai wadah]
ai0307
1
Siapa pun yang menemukan jawaban ini mungkin tertarik dengan cara menggunakan dokumen di sini untuk memberi makan perintah ke sebuah wadah: inilah jawaban saya untuk pertanyaan lain seperti ini tentang dokumen di sini, jangan ragu untuk memeriksanya .
Kohányi Róbert
14
docker run alpine sh -c "ls | wc >> xxx"ini banyak membantu saya, ketika bash tidak tersedia.
Eddy Hernandez
1
Ini berfungsi untuk cdtetapi tidak untuk hal-hal di mana masalah kode pengembalian ;tidak sama dengan &&lihat unix.stackexchange.com/questions/37069/…
Nick Zalutskiy
1
Terima kasih @NickZalutskiy, jawaban yang diperbarui dengan komentar Anda
anhlc
31

Anda dapat melakukan ini beberapa cara:

  1. Gunakan opsi -w untuk mengubah direktori kerja:

    -w, --workdir = "" Direktori yang berfungsi di dalam wadah

    https://docs.docker.com/engine/reference/commandline/run/#set-working-directory--w

  2. Sampaikan seluruh argumen ke / bin / bash:

    docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
    
John Petrone
sumber
Tidak disebutkan --workdirdalam tautan yang disediakan. Halaman mungkin telah dipindahkan / diubah. Dapat diperbarui ke docs.docker.com/engine/reference/run/#workdir atau docs.docker.com/engine/reference/commandline/run
marcv
10

Anda juga dapat menyalurkan perintah di dalam wadah Docker, bash -c "<command1> | <command2>"misalnya:

docker run img /bin/bash -c "ls -1 | wc -l"

Tetapi, tanpa menggunakan shell di remote, output akan dialihkan ke terminal lokal.

USER_1
sumber
3

Jika Anda ingin menyimpan hasilnya dalam satu file di luar wadah, di mesin lokal Anda, Anda dapat melakukan sesuatu seperti ini.

RES_FILE=$(readlink -f /tmp/result.txt)

docker run --rm -v ${RES_FILE}:/result.txt img bash -c "cat /etc/passwd | grep root > /result.txt"

Hasil dari perintah Anda akan tersedia di /tmp/result.txtdalam mesin lokal Anda.

Flamarion
sumber
2

Bagi siapa pun yang datang ke sini mencari untuk melakukan hal yang sama dengan docker-composeAnda hanya perlu menambahkan bash -cdan menyertakan beberapa perintah dalam tanda kutip, bergabung bersama &&.

Jadi dalam contoh OPs docker-compose run image bash -c "cd /path/to/somewhere && python a.py"

S ..
sumber
ini bekerja untuk saya tetapi proses buruh pelabuhan keluar setelah perintah dieksekusi
node_man
dan bagaimana cara keluar dari proses buruh pelabuhan seperti itu? menekan ctrl C atau ctrl Z atau mengetik keluar tidak berfungsi atau apakah saya harus membunuhnya dengan perintah berhenti buruh pelabuhan?
node_man
tidak docker-compose down [service-name]tidak bekerja atau? (dan tidak perlu khawatir, selamat datang :))
S ..
2

Hanya untuk membuat jawaban yang tepat dari komentar @ Eddy Hernandez dan yang sangat benar karena Alpine datang dengan abu bukan bash.

Pertanyaannya sekarang referes untuk Memulai shell dalam wadah Docker Alpine yang menyiratkan menggunakan shatau ashatau /bin/shatau /bin/ash/.

Berdasarkan pertanyaan OP:

docker run image sh -c "cd /path/to/somewhere && python a.py"

Nqsir
sumber
1

bash -cberfungsi dengan baik jika perintah yang Anda jalankan relatif sederhana. Namun, jika Anda mencoba menjalankan serangkaian panjang perintah yang penuh dengan karakter kontrol, itu bisa menjadi rumit.

Saya berhasil menyelesaikan ini dengan menyalurkan perintah saya ke dalam proses dari luar, yaitu

cat script.sh | docker run -i <image> /bin/bash

pengguna2966041
sumber