standard_init_linux.go: 190: exec kullanıcı işlemi "böyle bir dosya veya dizin olmamasına" neden oldu - Docker


108

Docker imajımı Windows 10'da çalıştırdığımda şu hatayı alıyorum:

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

docker dosyam:

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"]

ve komut dosyası #! / bin / sh ile başlıyor

#!/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

Denenen yöntem1: #! / Bin / sh'yi #! / Bin / bash olarak değiştirmeyi denedi, ancak aynı hatayı alıyorum.

Denenen method2: docker dosyasına dos2unix eklendi

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

Yanıtlar:


153

Notepad ++ kullanın, düzenle -> EOL dönüşümü -> CRLF'den LF'ye değiştirin.


4
Mükemmel! Dockerfile dosyamdan çalıştırılan bir .sh dosyası ekledim. Satır sonlarını ve Ta Da'yı değiştirdim. Teşekkürler
Sweet Chilly Philly

Bu seçeneği notepad ++ 'da' edit sekmesinde 'bulamadım ancak Windows (CR LF) yazan sağ alt taraftaki butona tıklayarak değiştirdim ve Unix'e geçtim. Çok teşekkürler!
Tobo

Aynı sorunu yaşıyorum ve tavsiyenizle çözüyorum. Çok teşekkür ederim!
truthblue82

Teşekkür ederim! İyi çalıştı! Ben de aynı sorundan acı çekiyordum.
ironrainbow

1
Windows'ta ckan docker görüntüleri oluşturmaya ve çalıştırmaya çalışırken bu hatayı aldım. Klonlanmış bir depoda bu sorunla karşılaşırsanız, klonlama sırasında core.autocrlf ayarını kullanmak yararlı olabilir, öyleyse şunu çalıştırın: git config core.autocrlf input => (deleted the files from the repo; wasn't sure if git reset would reset the newlines) => git reset --hardKopyalanan: github.com/LiveOverflow/PwnAdventure3/issues/11
Emil G

66

giriş noktasını aşağıdaki gibi değiştirin. Benim için çalıştı

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

Tuomastik'in yorumlarda işaret ettiği gibi , dokümanlar ilk parametrenin çalıştırılabilir olmasını gerektirir:

ENTRYPOINT'in iki formu vardır:

ENTRYPOINT ["executable", "param1", "param2"] (exec formu, tercih edilir)

ENTRYPOINT command param1 param2 (kabuk formu)


Benim için çalıştı. Bu durumda, kabuk betiğine #! / Bin / sh eklememize bile gerek yoktur. ENTRYPOINT'te "sh" den bahsetmek işi
halleder

9
"Sh" nin neden ve ne zaman gerekli olduğunu açıklayabilir misiniz? Onsuz çalışan birçok örnek gördüm.
Opsse

1
@Opsse Olmadan "sh", normal kabuk işleme kaynağı
tuomastik

1
ENTRYPOINT betiğimde /bin/bashkabuk yorumlayıcısı olarak kullandığım ortaya çıktı , ancak resmim alp tabanlı olduğu için onunla gelmedi. Senaryomun değişti bashtarafından shve sorun çözüldü.
morpheuz

56

alpineResmi kullanırken aynı sorunu yaşadım .

Dosyam .shaşağıdaki ilk satırı içeriyordu:

#!/bin/bash

Alpine'de bash yoktur. Yani hattı değiştirerek

#!/bin/sh

veya bash'ı kurmak

apk add --no-cache bash

sorunu benim için çözdü.


1
Bu! Apline'ın Docker Hub sayfasında kalın yazılmalıdır.
53'te hashlock

16

benim durumumda ben den biten çizgiyi değiştirmek zorunda CRLFiçin LFiçin run.shdosya ve hata gitmişti.

Umarım bu yardımcı olur,
Kirsten


1
Aynı dosyaları defalarca düzeltmek zorundayım. Sanki pencereler beni ekosisteminin içinde tutmak istiyor.
Jonathan Czitkovics

@JonathanCzitkovics belki git yapılandırmanızı ve kod düzenleyicinizin ayarlarını kontrol etmelisiniz
KirKone

10

Go binary'nizi alpine konteynerde çalıştırırken bu sorunla karşılaştığınızı varsayalım. Bölmenizi oluşturmadan önce aşağıdaki değişkeni dışa aktarın

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

Sonra go build


Dockerfile içinde bu, go derleme satırından önce ENV CGO_ENABLED = 0 ekleyin. Bu benim için çalıştı.
Madhan Ganesh

Dockerfile'da şu şekilde olmalıdır:RUN export CGO_ENABLED=0 && go build
BMW

Bu da işe yarıyorRUN CGO_ENABLED=0 go build
Alan Sereb

9

Bu bir CRLF sorunu. Bunu kullanarak sorunu çözdüm:

git config --global core.eol lf

git config --global core.autocrlf input

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

Çok teşekkür ederim! Günümü kurtardı.
Alex

8

Linux'tan "böyle bir dosya veya dizin gelmiyor" ve aşağıdaki nedenleri gördüm:

İlk neden, dosyanın aslında kabınızın içinde olmamasıdır. Bazı kişiler, görüntülerine eklemeden ana bilgisayardan bir komut çalıştırmaya çalışır. Bazı insanlar, çalıştırmak istedikleri komutun üzerine bir birim yerleştirerek komutlarını gölgeliyorlar. Aynı kabı çalıştırırsanız, ancak normal giriş noktası / cmd değeriniz yerine bir kabuk kullanırsanız ve bir çalıştırırsanız, ls /path/to/cmdbunun var olup olmadığını görürsünüz.

Bir sonraki neden yanlış komutu çalıştırmaktır. Bu genellikle, doğru şekilde ayrıştırılmayan çalıştırılacak komutun json / exec biçimlendirmesiyle ortaya çıkar. Çalıştırmaya çalışan bir komut ["app",veya benzer bir şey görürseniz , json dizesi Docker tarafından çözümlenmemiş ve Linux komutu bir dize olarak ayrıştırmak için bir kabuk kullanmaya çalışıyor demektir. Bu, bağımsız değişkenleri yanlış sıralarsanız da meydana gelebilir, örneğin çalıştırmaya çalışmak -it, bayrakların görüntü adından önce yerleştirilmesi gerektiğinde görüntü adından sonra yerleştirmeye çalıştığınız bir işarettir.

Kabuk komut dosyalarında, bu hata #!, kabın içinde mevcut olmayan bir komutun bulunduğu ilk satır işaret ediyorsa görünür . Bazıları için bu, bashyalnızca sahip olan bir görüntüde çalışmaya çalışıyor /bin/sh. Ve sizin durumunuzda, bu komut dosyasındaki Windows satır beslemelerinden olabilir. Editörünüzde Linux / Unix satır beslemelerine geçmek bunu düzeltir.

İkili dosyalarda, bağlantılı bir kitaplık eksikse bu hata görünür. Bunu, ile derlenen libc, ancak muslherhangi bir kitaplık ile veya hiç kitaplık olmadan dağda çalışan Go komutlarında sık sık gördüm . Ya tüm eksik kitaplıkları eklemeniz ya da komutunuzu statik olarak derlemeniz gerekir. Bu kütüphane bağlantılarını görmek ldd /your/appiçin ikili programınızda kullanın .


3
Teşekkürler! Sıfırdan resimdeki go uygulamam için, CGO_ENABLED = 0
Manuel Rony Gomes,

Benim Durumum: 1. Yürütülebilir ikili alpinden derlenmiştir, ancak go komutunu çalıştıran temel görüntü debian'dır, bu nedenle hata oluştu.
inix

5

Ben dolayı benim rep yorumun alamıyorum, ama sadece eklemek istedim: VSCode kullanıcıları için , size tıklayarak LF CRLF satır sonları değiştirebilir CRLF durum çubuğunda, ardından seçmek LF ve dosyayı kaydedin.

Ben de aynı sorunu yaşadım ve bu sorunu çözdü. VSCode için izlenecek adımlar


4

CRLF'yi Notepad ++ kullanarak LF ile değiştirme

  1. Notepad ++ 'ın Bul / Değiştir özelliği, bu gereksinimi oldukça iyi bir şekilde yerine getirir. Değiştir iletişim kutusunu (CTRL + H) açın, Genişletilmiş arama modunu (ALT + X) seçin, "\ r \ n" araması yapın ve "\ n" ile değiştirin:
  2. Tümünü Değiştir'e basın (ALT + A)

Docker görüntüsünü yeniden oluşturun ve çalıştırın, sorununuzu çözecektir.


3

Aşağıdakiler gibi benzer bir hataya dikkat edin:

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

Bir görüntünün oluşturulduğu mimari sisteminizden biriyle eşleşmiyorsa ortaya çıkabilir. Örneğin arm64, bir x86_64makine için oluşturulmuş bir imajı çalıştırmaya çalışmak bu hatayı oluşturabilir.


1
Bunu yazdığın için teşekkürler. Ubuntu ile inşa ettiğimi ve alp ve alp ile koştuğumun muhtemelen ihtiyaç duyulan bir şeyin eksik olduğunu anlamamı sağladı.
Kip


0

Bu sorunu çözüyorum, ayarlarımı vscode'da yapıyorum.

  1. Dosya
    1. Tercihler
      1. Ayarlar
        1. Metin düzeltici
          1. Dosyalar
          2. Eol - \ n olarak ayarla

Saygılarımızla

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.