docker:$ PATHに実行可能ファイルが見つかりません


216

インストールするDockerイメージがありますがgrunt、実行しようとするとエラーが発生します。

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

対話モードでbashを実行すると、gruntが使用可能になります。

何が悪いのですか?

ここに私の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"]

あなたはドッカーを使ってビルドしてみませんCMD gruntか?または、フルパスを渡してgruntコマンドを実行してみませんか?
mgaido 2014年

@ mark91あなたが使用して再構築を求めているかについて詳しく説明できてくださいCMD grunt?ドロップDOは、あなたが意味する[""]
Steve Lorimer、2014年

試してみました-そしてそれはうまくいきました-ありがとう!したがって、他の参加者は次のように変更CMD ["grunt"]しますCMD grunt
スティーブロリマー2014年

10
これは、CMD ["grunt"]別のシェルを使用してコマンドを実行する場合、そのシェルでは$ PATHが設定されない可能性が高いためです。
mgaido 2014年

回答:


198

コマンド(たとえばCMD ["grunt"]、二重引用符を含むJSON配列)にexec形式を使用すると、シェルなしで実行されます。これは、ほとんどの環境変数が存在しないことを意味します。

コマンドを通常の文字列(例:)として指定した場合CMD grunt、後の文字列CMDはで実行され/bin/sh -cます。

この詳細については、Dockerfileリファレンスの CMDセクションをご覧ください



この馬鹿げた質問はすみませんが、どうすればシェルなしでLinuxコマンドを実行できますか?(Dockerを使用していない)Linuxマシンでこれを行うのと同じことは何ですか?
wisbucky

1
私自身の質問に答えるには、sudo setまたはを行うのと同じ(exec set)です。それらはシェルなしでコマンドを実行するため(そしてset組み込みのシェルであるため)失敗します。しかし、sudo lsおよび(exec ls)ので動作するls実際のバイナリファイルです/bin/ls
wisbucky

315

これは、エラーメッセージを貼り付けたときのGoogleでの最初の結果でした。これは、引数が正しくなかったためです。

コンテナ名はすべての引数の後にある必要があります。

悪い:

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

良い:

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

132
コーディングを始める前に常にドキュメントを徹底的に読んだ場合、何も成し遂げられないでしょう。新しい車を買ったとき、家に帰る前に200ページのマニュアルを読みましたか。いいえ。車に問題があった場合、最初にグーグルで検索しましたか、それともマニュアルを入手しましたか?これは完全に合理的であり、私はそれが有用であると思ったが賛成ボタンをクリックしなかったすべての人しか想像できない!まったく不合理なのは、このまったく関係のない答えがこのエラーメッセージの最初のgoogleの結果である、またはdocker cliが直感的で許容できないということです。乾杯。
16年

8
多くのスクリプトでは、フラグの順序は重要ではないので、これが誰にでも起こり得るのかがわかります。答えはとても役に立ちます。言うまでもなく、Dockerからのエラーメッセージはまったく役に立ちません。
marios 2017年

9
うわー、この答えがなければ、しばらく苦労しました。なぜUNIXには、標準で柔軟で強力なCLI引数パーサーがすでにないのですか?...
lleaff

1
これは私にとって問題でした。最後にコンテナ名を付けるとうまくいくようです
Rob Segal

3
私は受け入れられた答えに誤解を招き、自分で書きたかったのですが、すでにここにあるようです。これで問題が解決することを確認できます...
Arturas M

24

同じ問題が見つかりました。私は次のことをしました:

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

に変更すると

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

それは正常に動作します。


1
それは私の男のために働いたが、私は-vここの使い方を理解していません。-v(で説明されているようにdocker run --help | grep "\-v")ボリュームをバインドマウントすることです。私にとって/tmpは、File Sharing(Docker設定)ですでにマウントされているので、なぜ再度使用する必要があるのですか?
Ahmad

12

このようなエラーにはいくつかの理由が考えられます。

私の場合、それは(実行ファイルによるものであったdocker-entrypoint.shからゴーストDockerfileをブログ、私はそれをダウンロードしたい後、実行可能ファイルモードを欠いています)。

解決: chmod +x docker-entrypoint.sh


これは私に正しい答えを示したコメントです。ファイルをコピーしてからchmodする必要がありました。
18年

7

Dockerコンテナーはシェルなしで構築される場合があります(例:https : //github.com/fluent/fluent-bit-docker-image/issues/19)。

この場合、静的にコンパイルされたシェルをコピーして実行できます。例:

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

何らかの理由で、「bash」クラリファイアを追加しない限り、そのエラーが発生します。エントリポイントファイルの先頭に "#!/ bin / bash"を追加しても、役に立ちませんでした。

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

@SteveLorimer、はい。私がやっCOPYた後、RUN chmod +x /compile_nibbler.shエントリポイントの呼び出しの前に。
beyondtheteal

1

私も同じ問題を抱えていましたが、グーグルを何度も行った後、それを修正する方法を見つけることができませんでした。

突然私は私の愚かな間違いに気づきました:)

docs述べたように、の最後の部分はdocker run、コンテナをロードした後に実行するコマンドとその引数です。

コンテナ名ではありません!!!

それは私の恥ずかしい間違いでした。

以下に、コマンドラインの画像を提供して、私が間違ったことを確認しました。

そして、これはドキュメントで言及されている修正です。

ここに画像の説明を入力してください


-7

機能させるには、/ usr / binにソフト参照を追加します。

ln -s $(どのノード)/ usr / bin / node

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


1
それが彼にどのように役立つかについての説明を追加してください。
Mathews Sunny
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.