standard_init_linux.go: 190: quá trình người dùng thực thi gây ra "không có tệp hoặc thư mục như vậy" - Docker


108

Khi tôi đang chạy hình ảnh docker của mình trên windows 10. Tôi gặp lỗi này:

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

tệp docker của tôi là:

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

và tập lệnh bắt đầu bằng #! / 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

Phương pháp đã thử 1: Đã thử thay đổi #! / Bin / sh thành #! / Bin / bash nhưng vẫn gặp lỗi tương tự.

Đã thử phương pháp2: đã thêm dos2unix vào tệp docker

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

Câu trả lời:


154

Sử dụng notepad ++, vào chỉnh sửa -> chuyển đổi EOL -> chuyển từ CRLF sang LF.


4
Hoàn hảo! Tôi đã thêm một tệp .sh đang được chạy từ Dockerfile của tôi. Tôi thay thế các kết thúc dòng và Ta Da. Cảm ơn bạn
Sweet Chilly Philly

Tôi không tìm thấy tùy chọn này trong notepad ++ trong 'tab chỉnh sửa' nhưng tôi đã thay đổi nó bằng cách nhấp vào nút phía dưới bên phải được viết Windows (CR LF) và tôi đã thay đổi thành Unix. Cảm ơn rất nhiều!
Tobo

Tôi có cùng một vấn đề và giải quyết nó theo lời khuyên của bạn. Cảm ơn rât nhiều!
truthblue82

Cảm ơn bạn! Nó hoạt động tốt! Tôi đã bị cùng một vấn đề.
ironrainbow

1
Tôi gặp lỗi này khi cố gắng tạo và chạy hình ảnh ckan docker trên Windows. Nếu bạn gặp sự cố này trên repo nhân bản, có thể hữu ích khi sử dụng cài đặt core.autocrlf trong quá trình sao chép, nếu vậy, hãy thực thi: git config core.autocrlf input => (deleted the files from the repo; wasn't sure if git reset would reset the newlines) => git reset --hardĐã sao chép từ: github.com/LiveOverflow/PwnAdventure3/issues/11
Emil G

66

thay đổi điểm vào như bên dưới. Nó đã làm việc cho tôi

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

Như tuomastik đã chỉ ra trong các nhận xét , tài liệu yêu cầu tham số đầu tiên là tham số thực thi:

ENTRYPOINT có hai dạng:

ENTRYPOINT ["executable", "param1", "param2"] (biểu mẫu thực thi, ưu tiên)

ENTRYPOINT command param1 param2 (dạng vỏ)


Đã làm cho tôi. Trong trường hợp này, chúng tôi thậm chí không cần thêm #! / Bin / sh trong tập lệnh shell. Nhắc đến "sh" trong EntryPoint hiện công việc
Gouravmoy Mohanty

9
Bạn có thể giải thích tại sao và khi nào "sh" là cần thiết? Tôi thấy nhiều ví dụ làm việc mà không có.
Opsse

1
@Opsse Không có "sh", quá trình xử lý shell thông thường không xảy ra nguồn
tuomastik

1
Hóa ra rằng trong tập lệnh ENTRYPOINT của tôi, tôi đã sử dụng /bin/bashlàm trình thông dịch shell, nhưng vì hình ảnh của tôi dựa trên núi cao nên không đi kèm với nó. Tôi đã thay đổi kịch bản bashcủa mình shvà vấn đề đã được giải quyết.
morpheuz

56

Tôi đã gặp vấn đề tương tự khi sử dụng alpinehình ảnh.

.shTệp của tôi có dòng đầu tiên sau:

#!/bin/bash

Alpine không có bash. Vì vậy, thay đổi dòng thành

#!/bin/sh

hoặc cài đặt bash với

apk add --no-cache bash

đã giải quyết vấn đề cho tôi.


1
Điều này! Nên in đậm trên trang Docker Hub của Apline.
hashlock

16

trong trường hợp của tôi, tôi đã phải thay đổi dòng kết thúc từ CRLFthành LFcho run.shtệp và lỗi đã biến mất.

Tôi hy vọng điều này sẽ giúp,
Kirsten


1
Tôi phải tiếp tục sửa các tệp giống nhau lặp đi lặp lại. Nó giống như windows muốn giữ tôi trong hệ sinh thái của nó.
Jonathan Czitkovics

@JonathanCzitkovics có lẽ bạn nên kiểm tra cấu hình của bạn git và các cài đặt cho trình soạn thảo code của bạn
KirKone

10

Giả sử bạn gặp phải vấn đề này trong khi chạy tệp nhị phân go của mình với trong vùng chứa núi cao. Xuất biến sau trước khi tạo thùng của bạn

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

Sau đó go build


trong Dockerfile đây là, thêm ENV CGO_ENABLED = 0 trước dòng xây dựng. Điều này đã làm việc cho tôi.
Madhan Ganesh

vì vậy trong Dockerfile, nó phải là:RUN export CGO_ENABLED=0 && go build
BMW

Điều này cũng hoạt độngRUN CGO_ENABLED=0 go build
Alan Sereb

9

Đó là một vấn đề CRLF. Tôi đã khắc phục sự cố bằng cách sử dụng cái này:

git config --global core.eol lf

git config --global core.autocrlf input

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

Cảm ơn bạn rất nhiều! Nó đã cứu một ngày của tôi.
Alex

8

"Không có tệp hoặc thư mục nào như vậy" đến từ Linux và tôi đã thấy các nguyên nhân sau:

Nguyên nhân đầu tiên là không thực sự có tệp bên trong vùng chứa của bạn. Một số người cố gắng chạy lệnh từ máy chủ lưu trữ mà không thêm lệnh đó vào hình ảnh của họ. Một số người ẩn lệnh của họ bằng cách gắn một ổ đĩa lên trên lệnh mà họ muốn chạy. Nếu bạn chạy cùng một vùng chứa, nhưng với một trình bao thay vì giá trị entrypoint / cmd bình thường của bạn và chạy một vùng chứa, ls /path/to/cmdbạn sẽ thấy điều này có tồn tại hay không.

Nguyên nhân tiếp theo là chạy sai lệnh. Điều này thường xuất hiện với định dạng json / execute của lệnh chạy không phân tích cú pháp chính xác. Nếu bạn thấy một lệnh đang cố gắng chạy ["app",hoặc một cái gì đó tương tự, thì chuỗi json không được Docker phân tích cú pháp và Linux đang cố gắng sử dụng một trình bao để phân tích lệnh đó thành một chuỗi. Điều này cũng có thể xảy ra nếu bạn sắp xếp sai các args, ví dụ: cố gắng chạy -itlà một dấu hiệu bạn đã cố gắng đặt cờ sau tên hình ảnh khi chúng phải được đặt trước tên hình ảnh.

Với các tập lệnh shell, lỗi này xuất hiện nếu dòng đầu tiên #!trỏ đến một lệnh không tồn tại bên trong vùng chứa. Đối với một số người, điều này đang cố gắng chạy bashtrong một hình ảnh chỉ có /bin/sh. Và trong trường hợp của bạn, điều này có thể từ nguồn cấp dữ liệu Windows trong tập lệnh. Chuyển sang nguồn cấp dữ liệu Linux / Unix trong trình chỉnh sửa của bạn sẽ khắc phục điều đó.

Với tệp nhị phân, lỗi này xuất hiện nếu thiếu thư viện được liên kết. Tôi đã thấy điều này thường xuyên khi các lệnh Go được biên dịch bằng libc, nhưng chạy trên núi cao có muslhoặc không có thư viện nào cả. Bạn cần bao gồm tất cả các thư viện bị thiếu hoặc biên dịch lệnh tĩnh của bạn. Để xem các liên kết thư viện này, hãy sử dụng ldd /your/apptrên tệp nhị phân của bạn.


3
Cảm ơn! Đối với ứng dụng đi của tôi trong hình ảnh đầu, phải xây dựng lại sử dụng CGO_ENABLED = 0
Manuel Rony Gomes

Trường hợp của tôi: 1. Executable binary được xây dựng từ núi cao, nhưng hình ảnh cơ sở chạy lệnh go là debian, vì vậy đã xảy ra lỗi.
inix

5

Tôi không thể nhận xét do đại diện của mình, nhưng tôi chỉ muốn nói thêm: đối với người dùng VSCode , bạn có thể thay đổi phần cuối dòng CRLF thành LF bằng cách nhấp vào CRLF trên thanh trạng thái, sau đó chọn LF và lưu tệp.

Tôi đã gặp vấn đề tương tự, và điều này đã giải quyết nó. Các bước cần thực hiện đối với VSCode


4

Thay thế CRLF bằng LF bằng Notepad ++

  1. Tính năng Tìm / Thay thế của Notepad ++ xử lý yêu cầu này khá tốt. Chỉ cần hiển thị hộp thoại Thay thế (CTRL + H), chọn Chế độ tìm kiếm mở rộng (ALT + X), tìm kiếm “\ r \ n” và thay thế bằng “\ n”:
  2. Nhấn Thay thế Tất cả (ALT + A)

Xây dựng lại và chạy hình ảnh docker sẽ giải quyết được vấn đề của bạn.


3

Lưu ý một lỗi tương tự như:

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

có thể xảy ra nếu kiến ​​trúc mà hình ảnh được xây dựng không khớp với kiến ​​trúc trong hệ thống của bạn. Ví dụ: cố gắng chạy một hình ảnh được xây dựng arm64trên x86_64máy có thể tạo ra lỗi này.


1
Cảm ơn vì đã viết điều đó. Nó khiến tôi nhận ra rằng tôi đang xây dựng với ubuntu và chạy với alpine và alpine có lẽ đang thiếu thứ gì đó cần thiết.
Kip


0

Tôi giải quyết vấn đề này đặt cài đặt của tôi trong vscode.

  1. Tập tin
    1. Sở thích
      1. Cài đặt
        1. Trình soạn thảo văn bản
          1. Các tập tin
          2. Eol - đặt thành \ n

Trân trọng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.