standard_init_linux.go: 190: กระบวนการผู้ใช้ exec ทำให้“ ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว” - Docker


123

เมื่อฉันใช้งานอิมเมจนักเทียบท่าบน windows 10 ฉันได้รับข้อผิดพลาดนี้:

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

พยายามวิธีที่ 1: พยายามเปลี่ยน #! / bin / sh เป็น #! / bin / bashแต่ได้รับข้อผิดพลาดเดียวกัน

วิธีที่พยายาม 2: เพิ่ม dos2unix ในไฟล์นักเทียบท่า

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

คำตอบ:


180

ใช้ notepad ++ ไปที่แก้ไข -> การแปลง EOL -> เปลี่ยนจาก CRLF เป็น LF


6
สมบูรณ์แบบ! ฉันได้เพิ่มไฟล์. sh ซึ่งกำลังเรียกใช้จาก Dockerfile ของฉัน ฉันแทนที่ปลายบรรทัดและตาดา ขอบคุณ
Sweet Chilly Philly

ฉันไม่พบตัวเลือกนี้ใน notepad ++ ใน 'แก้ไขแท็บ' แต่ฉันได้เปลี่ยนการคลิกที่ปุ่มด้านล่างขวาที่เขียน Windows (CR LF) และฉันเปลี่ยนเป็น Unix ขอบคุณมาก!
Tobo

ฉันมีปัญหาเดียวกันและแก้ไขตามคำแนะนำของคุณ ขอบคุณมาก!
truthblue82

ขอขอบคุณ! มันทำงานได้ดี! ฉันทุกข์ทรมานจากปัญหาเดียวกัน
ironrainbow

2
ฉันได้รับข้อผิดพลาดนี้เมื่อพยายามสร้างและเรียกใช้ ckan docker images บน Windows หากคุณพบปัญหานี้ใน repo ที่ถูกโคลนอาจเป็นประโยชน์ในการใช้การตั้งค่า 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

71

เปลี่ยนจุดเข้าตามด้านล่าง มันได้ผลสำหรับฉัน

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

ในฐานะที่เป็น tuomastik ชี้ให้เห็นในการแสดงความคิดเห็น , เอกสารต้องใช้พารามิเตอร์แรกที่จะปฏิบัติการ:

ENTRYPOINT มีสองรูปแบบ:

ENTRYPOINT ["executable", "param1", "param2"] (แบบฟอร์ม exec ต้องการ)

ENTRYPOINT command param1 param2 (แบบเปลือก)


ทำงานให้ฉัน ในกรณีนี้เราไม่จำเป็นต้องเพิ่ม #! / bin / sh ในเชลล์สคริปต์ด้วยซ้ำ การพูดถึง "sh" ใน ENTRYPOINT ได้ผล
Gouravmoy Mohanty

10
คุณสามารถอธิบายได้ไหมว่าทำไมและเมื่อใดจึงจำเป็นต้องใช้ "sh" ฉันเห็นตัวอย่างมากมายที่ใช้งานได้โดยไม่ต้อง
Opsse

1
@Opsse หากไม่มี"sh"การประมวลผลเชลล์แบบปกติจะไม่เกิดขึ้นที่มา
tuomastik

2
ปรากฎว่าในสคริปต์ ENTRYPOINT ของฉันฉันใช้/bin/bashเป็นตัวแปลเชลล์ แต่เนื่องจากรูปภาพของฉันเป็นแบบอัลไพน์จึงไม่ได้มาพร้อมกับมัน ผมเปลี่ยนในสคริปต์ของฉันbashโดยshและแก้ไขปัญหา
morpheuz

63

ฉันมีปัญหาเดียวกันเมื่อใช้alpineรูปภาพ

.shไฟล์ของฉันมีบรรทัดแรกต่อไปนี้:

#!/bin/bash

อัลไพน์ไม่มีการทุบตี เลยเปลี่ยนสายเป็น

#!/bin/sh

หรือติดตั้ง bash ด้วย

apk add --no-cache bash

แก้ไขปัญหาให้ฉัน


2
นี้! ควรเป็นตัวหนาในหน้า Docker Hub ของ Apline
hashlock

ใช่นี่มัน หากคุณใช้entrypoint.shไฟล์ที่มีAlpineภาพนักเทียบท่าให้ใช้#!/bin/shแทน bash!
Vladimir

18

สมมติว่าคุณประสบปัญหานี้ในขณะที่เรียกใช้ go binary กับใน alpine container ส่งออกตัวแปรต่อไปนี้ก่อนสร้างถังขยะของคุณ

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

แล้ว go build


ภายใน Dockerfile นี่คือเพิ่ม ENV CGO_ENABLED = 0 ก่อนบรรทัดสร้างไป สิ่งนี้ได้ผลสำหรับฉัน
Madhan Ganesh

ดังนั้นใน Dockerfile ควรเป็น:RUN export CGO_ENABLED=0 && go build
BMW

16

ในกรณีของฉันฉันต้องเปลี่ยนบรรทัดที่ลงท้ายจากCRLFเป็นLFสำหรับrun.shไฟล์และข้อผิดพลาดก็หายไป

ฉันหวังว่านี่จะช่วยได้
Kirsten


1
ฉันต้องแก้ไขไฟล์เดิมซ้ำแล้วซ้ำเล่า มันเหมือนกับว่าหน้าต่างต้องการให้ฉันอยู่ในระบบนิเวศ
Jonathan Czitkovics

@JonathanCzitkovics บางทีคุณควรตรวจสอบการกำหนดค่าคอมไพล์และการตั้งค่าสำหรับโปรแกรมแก้ไขโค้ดของคุณ
KirKone

9

มันเป็นปัญหา CRLF ฉันแก้ไขปัญหาโดยใช้สิ่งนี้:

git config --global core.eol lf

git config --global core.autocrlf input

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

ขอบคุณมาก! มันช่วยวันของฉัน
Alex

8

"ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว" มาจาก Linux และฉันพบสาเหตุต่อไปนี้:

สาเหตุแรกไม่ได้มีไฟล์อยู่ในคอนเทนเนอร์ของคุณจริงๆ บางคนพยายามเรียกใช้คำสั่งจากโฮสต์โดยไม่เพิ่มลงในรูปภาพของตน บางคนเงาคำสั่งของพวกเขาโดยติดตั้งโวลุ่มไว้ด้านบนของคำสั่งที่พวกเขาต้องการเรียกใช้ หากคุณเรียกใช้คอนเทนเนอร์เดียวกัน แต่ใช้เชลล์แทนค่าจุดเข้า / cmd ปกติและเรียกใช้ls /path/to/cmdคุณจะเห็นว่ามีอยู่หรือไม่

สาเหตุต่อไปคือการเรียกใช้คำสั่งที่ไม่ถูกต้อง สิ่งนี้มักปรากฏขึ้นพร้อมกับการจัดรูปแบบคำสั่ง json / exec เพื่อรันที่แยกวิเคราะห์ไม่ถูกต้อง หากคุณเห็นคำสั่งที่พยายามรัน["app",หรือสิ่งที่คล้ายกันแสดงว่าสตริง json ไม่ได้แยกวิเคราะห์โดย Docker และ Linux พยายามใช้เชลล์เพื่อแยกวิเคราะห์คำสั่งเป็นสตริง นอกจากนี้ยังสามารถเกิดขึ้นได้หากคุณจัดลำดับ args ผิดเช่นการพยายามรัน-itเป็นสัญญาณที่คุณพยายามวางแฟล็กหลังชื่อรูปภาพเมื่อต้องวางไว้หน้าชื่อรูปภาพ

ด้วยเชลล์สคริปต์ข้อผิดพลาดนี้จะปรากฏขึ้นหากบรรทัดแรกที่#!ชี้ไปยังคำสั่งที่ไม่มีอยู่ภายในคอนเทนเนอร์ สำหรับบางคนสิ่งนี้พยายามทำงานbashในภาพที่มีเพียง/bin/shไฟล์. และในกรณีของคุณอาจมาจากไลน์ฟีดของ Windows ในสคริปต์ การเปลี่ยนไปใช้ไลน์ฟีดของ Linux / Unix ในตัวแก้ไขของคุณจะแก้ไขได้

ด้วยไบนารีข้อผิดพลาดนี้จะปรากฏขึ้นหากไม่มีไลบรารีที่เชื่อมโยง ฉันเคยเห็นสิ่งนี้บ่อยครั้งเมื่อคำสั่ง Go ที่คอมไพล์ด้วยlibcแต่ทำงานบนเทือกเขาแอลป์โดยมีmuslหรือขีดข่วนโดยไม่มีไลบรารีใด ๆ เลย คุณต้องรวมไลบรารีที่หายไปทั้งหมดหรือคอมไพล์คำสั่งของคุณแบบคงที่ หากต้องการดูลิงก์ไลบรารีเหล่านี้ให้ใช้ldd /your/appกับไบนารีของคุณ


3
ขอบคุณ! สำหรับแอปพลิเคชัน go ของฉันในภาพเริ่มต้นต้องสร้างใหม่โดยใช้ CGO_ENABLED = 0
Manuel Rony Gomes

กรณีของฉัน: 1. ไบนารีที่เรียกใช้งานได้ถูกสร้างขึ้นจากอัลไพน์ แต่อิมเมจพื้นฐานที่เรียกใช้คำสั่ง go เป็นเดเบียนจึงเกิดข้อผิดพลาด
inix

6

ฉันไม่สามารถแสดงความคิดเห็นได้เนื่องจากตัวแทนของฉัน แต่ฉันแค่อยากจะเพิ่ม: สำหรับผู้ใช้ VSCodeคุณสามารถเปลี่ยนการลงท้ายบรรทัด CRLF เป็น LF โดยคลิกที่CRLFในแถบสถานะจากนั้นเลือกLFและบันทึกไฟล์

ฉันมีปัญหาเดียวกันและสามารถแก้ไขได้ ขั้นตอนในการปฏิบัติตามสำหรับ VSCode


4

การแทนที่ CRLF ด้วย LF โดยใช้ Notepad ++

  1. คุณสมบัติค้นหา / แทนที่ของ Notepad ++ จัดการกับความต้องการนี้ได้ดีทีเดียว เพียงเปิดกล่องโต้ตอบแทนที่ (CTRL + H) เลือกโหมดการค้นหาแบบขยาย (ALT + X) ค้นหา“ \ r \ n” และแทนที่ด้วย“ \ n”:
  2. ตีแทนที่ทั้งหมด (ALT + A)

สร้างและเรียกใช้อิมเมจนักเทียบท่าใหม่ควรแก้ปัญหาของคุณได้


3

สังเกตข้อผิดพลาดที่คล้ายกันเช่น:

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

สามารถเกิดขึ้นได้หากสถาปัตยกรรมที่สร้างอิมเมจไม่ตรงกับหนึ่งในระบบของคุณ ยกตัวอย่างเช่นพยายามที่จะใช้ภาพที่สร้างขึ้นสำหรับarm64ในx86_64เครื่องสามารถสร้างข้อผิดพลาดนี้


1
ขอบคุณที่เขียนข้อความนั้น มันทำให้ฉันรู้ว่าฉันกำลังสร้างด้วยอูบุนตูและการวิ่งด้วยเทือกเขาแอลป์และอัลไพน์นั้นน่าจะขาดบางสิ่ง
Kip


0

ฉันแก้ปัญหานี้ตั้งค่าของฉันใน vscode

  1. ไฟล์
    1. ค่ากำหนด
      1. การตั้งค่า
        1. แก้ไขข้อความ
          1. ไฟล์
          2. Eol - ตั้งค่าเป็น \ n

ความนับถือ


0

ฉันพบกรณีขอบเฉพาะที่ฉันใช้tini initในคอนเทนเนอร์อัลไพน์แต่เนื่องจากฉันไม่ได้ใช้เวอร์ชันที่เชื่อมโยงแบบคงที่และAlpine ใช้ musl libc แทนที่จะเป็นไลบรารี GNU LibCติดตั้งโดยค่าเริ่มต้นมันจึงขัดข้องเหมือนกัน ข้อความผิดพลาด.

หากฉันเข้าใจสิ่งนี้และใช้เวลาในการอ่านเอกสารอย่างถูกต้องฉันจะพบTini Staticซึ่งเมื่อเปลี่ยนเป็นแก้ไขปัญหาของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.