docker çalıştır <IMAGE> <ÇOK KOMUT


255

Bunun gibi ÇOKLU komutları çalıştırmaya çalışıyorum.

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

Ama bu bana "böyle bir dosya veya dizin yok" hatası verir, çünkü olarak yorumlanır ...

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

"" Veya () gibi bazı ESCAPE karakterleri gerekiyor gibi görünüyor.

Ben de denedim

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

ama bunlar işe yaramadı.

Docker Run Reference'i aradım ancak ESCAPE karakterleri hakkında herhangi bir ipucu bulamadım.

Yanıtlar:


440

Docker'da birden çok komut çalıştırmak için /bin/bash -cve noktalı virgül kullanın;

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

Komut2'ye (python) ihtiyacımız olması durumunda ve yalnızca komut1 (cd) sıfır (hata yok) çıkış durumu döndürdüyse yürütülür, &&yerine;

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

İpucu için teşekkürler! Ben sadece [docker run image "cd / bin; ls"] denedim ve aşağıdaki hata mesajlarını aldım. [exec: "cd / bin; ls": stat cd / bin; ls: böyle bir dosya veya dizin yok] [
Daemon'dan

1
Herkes bu cevabın, bir konteynere komutları beslemek için burada belgelerin nasıl kullanılacağıyla ilgilenebileceğini düşünüyor: işte burada belgelerle ilgili böyle bir soruya cevabım, bunu kontrol etmekten çekinmeyin .
Kohányi Róbert

14
docker run alpine sh -c "ls | wc >> xxx"bash mevcut olmadığında bu bana çok yardımcı oluyor.
Eddy Hernandez

1
Bu cd, dönüş kodlarının önemli ;olduğu şeyler için çalışır, ancak &&bkz. Unix.stackexchange.com/questions/37069/…
Nick Zalutskiy

1
Teşekkürler @NickZalutskiy, yorumunuzla birlikte cevap güncellendi
anhlc

31

Bunu birkaç yolla yapabilirsiniz:

  1. Çalışma dizinini değiştirmek için -w seçeneğini kullanın:

    -w, --workdir = "" Kapsayıcı içindeki çalışma dizini

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

  2. Tüm argümanı / bin / bash öğesine iletin:

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

--workdirSağlanan bağlantıda bahsedilmiyor . Sayfa muhtemelen taşınmış / değişmiştir. Docs.docker.com/engine/reference/run/#workdir veya docs.docker.com/engine/reference/commandline/run
marcv

10

Ayrıca Docker kapsayıcısının içindeki komutları da iletebilirsiniz, bash -c "<command1> | <command2>"örneğin:

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

Ancak, uzaktan kumandadaki kabuk çağrılmadan, çıkış yerel terminale yönlendirilecektir.


3

Sonucu kapsayıcı dışındaki bir dosyada, yerel makinenizde saklamak istiyorsanız, böyle bir şey yapabilirsiniz.

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"

Komutlarınızın sonucu /tmp/result.txtyerel makinenizde mevcut olacaktır .


2

Buraya docker-composesizinle aynı şeyi yapmak isteyen başka herkes için, bash -cbirden fazla komutu tırnak işaretleri içine almalı ve eklemelisiniz &&.

Yani OP örneğinde docker-compose run image bash -c "cd /path/to/somewhere && python a.py"


Bu benim için çalıştı ama docker işlemi komut yürütüldükten sonra
node_man

ve böyle bir docker işleminden nasıl çıkarım? ctrl C veya ctrl Z tuşlarına basmak veya exit yazmak işe yaramıyor ya da docker stop komutuyla öldürmek zorunda mıyım?
node_man

çalışmıyor docker-compose down [service-name]veya? (ve endişelenmenize gerek yok, yardım etmekten mutluluk duyuyoruz :))
S. ..

2

@Eddy Hernandez'in yorumundan doğru bir cevap vermek ve Alpine bash değil külle geldiğinden bu çok doğru.

Şimdi soru , Docker Alpine kapsayıcısındash veya ashveya /bin/shveya kullanılarak bir kabuk başlatma konusuna başvuruyor /bin/ash/.

OP'nin sorusuna dayanarak:

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


1

bash -cçalıştırdığınız komutlar nispeten basitse iyi çalışır. Ancak, kontrol karakterleriyle dolu uzun bir komut dizisi çalıştırmaya çalışıyorsanız, karmaşık hale gelebilir.

Komutlarımı dışarıdan işleme sokarak başarılı bir şekilde başardım, yani

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

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.