docker: yürütülebilir dosya $ PATH içinde bulunamadı


216

Yükleyen bir docker görüntüsü var grunt, ancak çalıştırmayı denediğimde bir hata alıyorum:

Error response from daemon: Cannot start container foo_1: \
    exec: "grunt serve": executable file not found in $PATH

Eğer bash'ı interaktif modda çalıştırırsam gruntkullanılabilir.

Neyi yanlış yapıyorum?

İşte benim Dockerfile:

# https://registry.hub.docker.com/u/dockerfile/nodejs/ (builds on ubuntu:14.04)
FROM dockerfile/nodejs

MAINTAINER My Name, me@email.com

ENV HOME /home/web
WORKDIR /home/web/site

RUN useradd web -d /home/web -s /bin/bash -m

RUN npm install -g grunt-cli
RUN npm install -g bower

RUN chown -R web:web /home/web
USER web

RUN git clone https://github.com/repo/site /home/web/site

RUN npm install
RUN bower install --config.interactive=false --allow-root

ENV NODE_ENV development

# Port 9000 for server
# Port 35729 for livereload
EXPOSE 9000 35729
CMD ["grunt"]

kullanarak liman işçisini inşa etmeye çalışabilir misiniz CMD grunt? Yoksa tam yolu geçerek grunt komutunu çalıştırmayı deneyebilir misiniz?
mgaido

@ mark91 kullanmakta yeniden yapı soruyorsun üzerinde durmak olabilir lütfen CMD grunt?bırak Do Şunu ["ve "]?
Steve Lorimer

Sadece denedim - ve işe yaradı - teşekkürler! Yani başkasının geldiği için, değişim CMD ["grunt"]içinCMD grunt
Steve Lorimer'in

10
Çünkü CMD ["grunt"]komutu yürütmek için başka bir kabuk kullanırsanız, bu kabukta $ PATH ayarlanmayacaktır.
14:47

Yanıtlar:


198

Bir komut için exec biçimini kullandığınızda (örn. CMD ["grunt"]Çift tırnaklı bir JSON dizisi) , kabuk olmadan yürütülür . Bu, çoğu ortam değişkeninin mevcut olmayacağı anlamına gelir.

Komutunuzu normal bir dize (örneğin CMD grunt) olarak belirtirseniz, sonraki dize CMDile yürütülür /bin/sh -c.

Bununla ilgili daha fazla bilgi Dockerfile referansının CMD bölümünde bulunabilir .



Bu aptal soruyu affedin, ama bir kabuk olmadan bir linux komutunu nasıl çalıştırabilirsiniz? Bunu linux makinesinde yapmanın eşdeğeri ne olacaktır (liman işçisi kullanmadan)?
wisbucky

1
Kendi sorumu cevaplamak için, sudo setveya yapmaya benzer (exec set). Bunlar başarısız olur çünkü komutları bir kabuk olmadan yürütürler (ve setbir kabuk yerleşikidir). Ancak sudo lsve (exec ls)çalışacak çünkü lsgerçek bir ikili dosyadır /bin/ls.
wisbucky

315

Bu, hata iletimi yapıştırdığımda google'daki ilk sonuçtu ve bunun nedeni argümanlarımın bozuk olmasıydı.

Kapsayıcı adı tüm bağımsız değişkenlerden sonra .

Kötü:

docker run <container_name> -v $(pwd):/src -it

İyi:

docker run -v $(pwd):/src -it <container_name>

132
Kodlamaya başlamadan önce belgeleri her zaman iyice okursanız, hiçbir şey yapamazsınız. Yeni arabanızı satın aldığınızda, eve gitmeden önce 200 sayfalık kılavuzu okudunuz mu? Hayır. Ve arabanızla ilgili bir sorun olduğunda, önce onu google mı yaptınız yoksa kılavuzu aldınız mı? Bu tamamen mantıklı, sadece yararlı bulan ancak upvote düğmesine tıklamayan tüm insanları hayal edebiliyorum! Mantıksız olan şey, bu tamamen alakasız cevabın bu hata mesajı için ilk google sonucu olması ya da docker klipsinin sezgisel ve affetmez olmasıdır. Şerefe.
sarink

8
Birçok senaryoda bayrakların sırası önemli değildir, bu yüzden bunun neden herkese olabileceğini görebiliyorum. Cevap oldukça faydalı. Docker'dan gelen hata mesajının hiç kullanışlı olmadığını söylemeye gerek yok.
marios

9
Vay, bu cevap olmasaydı bir süre mücadele ederdim. Neden UNIX'in zaten standart, esnek ve güçlü bir CLI bağımsız değişken ayrıştırıcısı yok? ...
lleaff

1
Benim için sorun buydu. Kap adının sonuna koymak işe
yaramış

3
Kabul edilen cevaptan yanıldım, kendim yazmak istedim, ama burada zaten var gibi görünüyor. Bu sorunun
çözüldüğünü

24

Aynı problemi buldum. Aşağıdakileri yaptım:

docker run -ti devops -v /tmp:/tmp /bin/bash

Olarak değiştirdiğimde

docker run -ti -v /tmp:/tmp devops /bin/bash

iyi çalışıyor.


1
Benim için çalıştı adamım, ama -vburada kullanımını anlamıyorum . -vbir birimi (açıklandığı gibi docker run --help | grep "\-v") bağlamak için, benim için zaten (Docker ayarları) /tmpmonte ettik File Sharing, neden tekrar kullanmalıyım?
Ahmad

12

Bunun gibi bir hatanın birkaç olası nedeni vardır.

Benim durumumda, bu (nedeniyle çalıştırılabilir dosyaya oldu docker-entrypoint.shdan Hayalet Dockerfile blog bunu indirilen vardı sonra yürütülebilir dosya modu eksik).

Çözüm: chmod +x docker-entrypoint.sh


Bu beni doğru cevaba işaret eden yorum. Dosyayı kopyalamak ve sonra chmod yapmak zorunda kaldım.
beyondtheteal

7

Docker konteyneri bir kabuk olmadan inşa edilebilir (örn. Https://github.com/fluent/fluent-bit-docker-image/issues/19 ).

Bu durumda, statik olarak derlenmiş bir kabuğu kopyalayabilir ve yürütebilirsiniz, örn.

docker create --name temp-busybox busybox:1.31.0
docker cp temp-busybox:/bin/busybox busybox
docker cp busybox mycontainerid:/busybox
docker exec -it mycontainerid /bin/busybox sh

4

Herhangi bir nedenle, "bash" temizleyicisini eklemezsem bu hatayı alıyorum. Giriş noktası dosyamın üstüne "#! / Bin / bash" eklemek bile yardımcı olmadı.

ENTRYPOINT [ "bash", "entrypoint.sh" ]

@SteveLorimer, evet. Bir COPYve sonra giriş RUN chmod +x /compile_nibbler.shnoktası çağrısı yaptım .
beyondtheteal

1

Aynı sorunu yaşadım, bir sürü googling yaptıktan sonra, nasıl düzeltileceğini bulamadım.

Aniden aptalca hatamı fark ettim :)

Dokümanlarda belirtildiği gibi ,docker run çalıştırmak istediğiniz komut ve kabı yükledikten sonra argümanlarıdır.

KONTEYNER ADI DEĞİL !!!

Bu benim utanç verici hatamdı.

Aşağıda neyi yanlış yaptığımı görmek için komut satırımın resmini verdim.

Ve bu, dokümanlarda belirtildiği gibi düzeltmedir .

resim açıklamasını buraya girin


-7

/ usr / bin'e yumuşak referans eklemek için:

ln -s $ (hangi düğüm) / usr / bin / düğüm

ln -s $ (hangi npm) / usr / bin / npm


1
Lütfen ona nasıl yardımcı olacağı hakkında açıklama ekleyin.
Mathews Sunny
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.