standard_init_linux.go:190:execユーザープロセスにより「そのようなファイルまたはディレクトリはありません」-Docker


122

Windows 10でDockerイメージを実行していると、次のエラーが発生します。

standard_init_linux.go:190: exec user process caused "no such file or directory"

私のdockerファイルは次のとおりです。

FROM openjdk:8

EXPOSE 8080

VOLUME /tmp

ADD appagent.tar.gz /opt/app-agent
ADD services.jar app.jar
ADD run.sh /run.sh

# Install compiler and perl stuff
RUN apt-get update
RUN apt-get install -y build-essential
RUN apt-get install -y gcc-multilib
RUN apt-get install -y perl

# Install Percona Toolkit
RUN apt-get install --yes percona-toolkit
RUN ["chmod", "+x", "/run.sh"]
ENTRYPOINT ["/run.sh"]

スクリプトは#!/ bin / shで始まります

#!/bin/sh
set -e

JAVA_OPTS="-Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/urandom"

if [ "${APPD_APP_NAME}" != "" ]; then
JAVA_AGENT="-javaagent:/opt/app-agent/javaagent.jar
fi

exec java ${JVM_OPTS} ${JAVA_OPTS} ${JAVA_AGENT} -jar /app.jar

方法1を試しました:#!/ bin / shを#!/ bin / bashに変更しようとしました が、同じエラーが発生しました。

method2を試しました:dockerファイルにdos2unixを追加しました

RUN apt-get install -y dos2unix
RUN dos2unix /run.sh

回答:


174

notepad ++を使用して、編集-> EOL変換-> CRLFからLFに変更します。


5
完璧!Dockerfileから実行されていた.shファイルを追加しました。行末とタダを入れ替えました。ありがとう
Sweet Chilly Philly 2018年

「編集タブ」のnotepad ++でこのオプションが見つかりませんでしたが、Windows(CR LF)と書かれた右下のボタンをクリックしてこのオプションを変更し、Unixに変更しました。どうもありがとう!
TOBO

私はあなたのアドバイスと同じ問題を抱えてそれを解決します。どうもありがとうございました!
Truthblue 8219年

ありがとうございました!それはうまくいきました!私は同じ問題に苦しんでいました。
ironrainbow

2
Windowsでckandockerイメージをビルドして実行しようとすると、このエラーが発生しました。クローンリポジトリでこの問題が発生した場合は、クローン中にcore.autocrlf設定を使用すると便利な場合があります。その場合は、次を実行します。git config core.autocrlf input => (deleted the files from the repo; wasn't sure if git reset would reset the newlines) => git reset --hardコピー元:github.com/LiveOverflow/PwnAdventure3/issues/11
Emil G

70

エントリポイントを次のように変更します。それは私のために働いた

ENTRYPOINT ["sh","/run.sh"]

tuomastikがコメントで指摘しているよう、ドキュメントでは最初のパラメーターが実行可能ファイルである必要があります。

ENTRYPOINTには2つの形式があります。

ENTRYPOINT ["executable", "param1", "param2"] (実行フォーム、推奨)

ENTRYPOINT command param1 param2 (シェルフォーム)


私のために働いた。この場合、シェルスクリプトに#!/ bin / shを追加する必要はありません。ENTRYPOINTで「sh」に言及することで仕事ができます
GouravmoyMohanty18年

10
「sh」が必要な理由と時期を説明できますか?私は多くの例がなくても機能するのを見ました。
Opsse 2018年

1
@Opsseがなければ"sh"、通常のシェルの処理は発生しませんソース
tuomastik

2
ENTRYPOINTスクリプトで/bin/bashシェルインタープリターとして使用していたことがわかりましたが、私の画像は高山ベースであるため、付属していませんでした。私は私のスクリプトで変更bashすることによってsh、問題は解決しました。
morpheuz

61

alpine画像を使用したときに同じ問題が発生しました。

私の.shファイルの最初の行は次のとおりです。

#!/bin/bash

アルパインにはbashがありません。したがって、行をに変更します

#!/bin/sh

またはbashをインストールする

apk add --no-cache bash

私のために問題を解決しました。


2
この!AplineのDockerHubページでは太字にする必要があります。
ハッシュロック

うん、これだ。docker imageを含むentrypoint.shファイルを使用している場合は、bashの代わりにAlpine使用して#!/bin/shください。
ウラジミール

17

高山コンテナでgoバイナリを実行しているときにこの問題に直面したとします。ビンを作成する前に、次の変数をエクスポートしてください

# CGO has to be disabled for alpine
export CGO_ENABLED=0

次に go build


Dockerfile内で、これは、goビルド行の前にENV CGO_ENABLED = 0を追加します。これは私のために働いた。
MadhanGanesh20年

Dockerfileでので、それは次のようになりますRUN export CGO_ENABLED=0 && go build
BMW

16

私の場合、私はから行末変更しなければならなかったCRLFLFためのrun.shファイルを、エラーが消えていました。

これがお役に立てば幸いです、
Kirsten


1
同じファイルを何度も修正し続ける必要があります。それは、Windowsが私をそのエコシステムに留めておきたいようなものです。
Jonathan Czitkovics 2018

@JonathanCzitkovicsは、多分あなたは、あなたのgitの設定とあなたのコードエディタの設定を確認する必要があり
KirKone

9

これはCRLFの問題です。私はこれを使用して問題を修正しました:

git config --global core.eol lf

git config --global core.autocrlf input

find . -type f -print0 | xargs -0 dos2unix

大いに感謝する!それは私の日を救った。
アレックス

8

「そのようなファイルまたはディレクトリはありません」はLinuxからのものであり、次の原因があります。

最初の原因は、実際にはファイルがコンテナ内にないことです。一部の人々は、イメージにコマンドを追加せずに、ホストからコマンドを実行しようとします。実行したいコマンドの上にボリュームをマウントして、コマンドをシャドウイングする人もいます。同じコンテナを実行しますが、通常のエントリポイント/ cmd値の代わりにシェルを使用して実行するls /path/to/cmdと、これが存在するかどうかがわかります。

次の原因は、間違ったコマンドを実行していることです。これは、正しく解析されない実行するコマンドのjson / execフォーマットでよく発生します。コマンドを実行しようとし["app",ているなどの場合、json文字列はDockerによって解析されておらず、Linuxはシェルを使用してコマンドを文字列として解析しようとしています。これは、引数の順序を間違えた場合にも発生する可能性があります。たとえば、実行しようとする-itと、画像名の前にフラグを配置する必要があるときに、画像名の後にフラグを配置しようとした兆候です。

シェルスクリプトでは、このエラーは、最初の行#!がコンテナ内に存在しないコマンドを指している場合に表示されます。一部の人にとっては、これは。bashのみを持つイメージで実行しようとしてい/bin/shます。そしてあなたの場合、これはスクリプトのWindowsラインフィードからのものである可能性があります。エディタでLinux / Unixの改行に切り替えると、それが修正されます。

バイナリでは、リンクされたライブラリがない場合にこのエラーが表示されます。これは、でコンパイルされたGoコマンドが、ライブラリを使用してlibcmuslまたはライブラリをまったく使用せずにスクラッチで実行するときによく見られます。不足しているすべてのライブラリを含めるか、コマンドを静的にコンパイルする必要があります。これらのライブラリリンクを表示するldd /your/appには、バイナリでを使用します。


3
ありがとう!スクラッチイメージのgoアプリケーションの場合、CGO_ENABLED = 0を使用して再構築する必要がありました
Manuel

私の場合:1。実行可能バイナリはalpineからビルドされていますが、goコマンドを実行しているベースイメージがdebianであるため、エラーが発生しました。
inix

6

担当者のためコメントできませんが、追加したかっただけです。VSCodeユーザーの場合、ステータスバーのCRLFをクリックしてCRLF行末をLFに変更し、LFを選択してファイルを保存できます。

私は同じ問題を抱えていました、そしてこれはそれを解決しました。 VSCodeの従う手順


4

Notepad ++を使用してCRLFをLFに置き換える

  1. Notepad ++の検索/置換機能は、この要件を非常にうまく処理します。[置換]ダイアログ(CTRL + H)を表示し、拡張検索モード(ALT + X)を選択して、「\ r \ n」を検索し、「\ n」に置き換えます。
  2. [すべて置換]をクリックします(ALT + A)

Dockerイメージを再構築して実行すると、問題が解決するはずです。


3

次のような同様のエラーに注意してください。

standard_init_linux.go:211: exec user process caused "no such file or directory"

イメージが構築されたアーキテクチャがシステムのアーキテクチャと一致しない場合に発生する可能性があります。たとえばarm64x86_64マシン上でビルドされたイメージを実行しようとすると、このエラーが発生する可能性があります。


1
それを書いてくれてありがとう。それは私がubuntuで構築していて、高山で走っていて、高山がおそらく必要なものを欠いていることに気づきました。
キップ


0

この問題を解決し、vscodeで設定を設定します。

  1. ファイル
    1. 環境設定
      1. 設定
        1. テキストエディタ
          1. ファイル
          2. Eol- \ nに設定

よろしく


0

私が使用していた特定のエッジケース見出さTINI INITにおける高山容器を、私は静的にリンクされたバージョンを使用していなかった、そして以来、GNUのlibcライブラリはlibcのではなく、アルパイン用途はMUSLデフォルトでインストールされ、それは非常に同じでクラッシュしましたエラーメッセージ。

これを理解し、ドキュメントを正しく読むのに時間がかかっていたら、Tini Staticを見つけたはずです。これを変更すると、問題が解決しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.