web-dev-qa-db-ja.com

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

Windows 10でdockerイメージを実行しているときに、次のエラーが表示されます。

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

私のドッカーファイルは次のとおりです。

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

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

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

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

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

56
Vikas Rathore

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

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

Tuomastikが コメント内 を指摘したように、 ドキュメント は最初のパラメーターが実行可能であることを要求します:

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

ENTRYPOINT ["executable", "param1", "param2"](実行形式、推奨)

ENTRYPOINT command param1 param2(シェル形式)

36
prity

私の場合、run.shファイルの行末をCRLFからLFに変更する必要があり、エラーはなくなりました。

これがお役に立てば幸いです、
キルスティン

11
KirKone

Alpineイメージを使用したときに同じ問題が発生しました。

.shファイルには、次の最初の行がありました。

#!/bin/bash

アルパインにはbashがありません。行を次のように変更します

#!/bin/sh

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

apk add --no-cache bash

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

5
daB0bby

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

git config --global core.eol lf

git config --global core.autocrlf input

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

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

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

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

2
Rajesh Samson

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

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

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

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

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

0
BMitch

これをDockerfileに追加します

RUN cat /run.sh | tr -d '\r' > /run.sh