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
Notepad ++を使用して、編集-> EOL変換-> CRLFからLFに変更します。
私の場合、run.sh
ファイルの行末をCRLF
からLF
に変更する必要があり、エラーはなくなりました。
これがお役に立てば幸いです、
キルスティン
Alpine
イメージを使用したときに同じ問題が発生しました。
.sh
ファイルには、次の最初の行がありました。
#!/bin/bash
アルパインにはbashがありません。行を次のように変更します
#!/bin/sh
またはbashをインストールする
apk add --no-cache bash
私のために問題を解決しました。
これはCRLFの問題です。私はこれを使用して問題を修正しました:
git config --global core.eol lf
git config --global core.autocrlf input
find . -type f -print0 | xargs -0 dos2unix
Notepad ++を使用してCRLFをLFに置き換える
Dockerイメージを再構築して実行すると、問題が解決するはずです。
「そのようなファイルやディレクトリはありません」というのは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
を使用します。
これをDockerfileに追加します
RUN cat /run.sh | tr -d '\r' > /run.sh