Heim  >  Artikel  >  Backend-Entwicklung  >  Docker-Ausführungsfehler: exec /app/backend/server: Keine solche Datei oder kein solches Verzeichnis

Docker-Ausführungsfehler: exec /app/backend/server: Keine solche Datei oder kein solches Verzeichnis

WBOY
WBOYnach vorne
2024-02-08 21:21:181114Durchsuche

Docker 运行错误:exec /app/backend/server:没有这样的文件或目录

Bei der Verwendung von Docker treten manchmal Lauffehler auf, z. B. die Fehlermeldung „exec /app/backend/server: Keine solche Datei oder kein solches Verzeichnis“. Dieser Fehler kann dazu führen, dass die Leute verwirrt sind, wie er behoben werden kann. Als Antwort auf dieses Problem hat der PHP-Editor Yuzai einige Lösungen für alle bereitgestellt, in der Hoffnung, allen zu helfen. Schauen wir uns als Nächstes an, wie dieses Problem gelöst werden kann.

Frageninhalt

Ich habe Probleme beim Ausführen eines Docker-Containers. Ich habe ein Image aus einer Docker-Datei erstellt:

docker build -t server -f ./backend/Dockerfile .

Führen Sie es aus:

docker run -it -p 8081:8081 server

Ein Fehler ist aufgetreten:

exec /app/backend/server: no such file or directory

Wenn ich über Docker Desktop nachschaue, sehe ich, dass die Datei im Container vorhanden ist und an dem Ort erstellt wurde, an dem sie sein sollte.

Ich habe auch versucht, die zweite Stufe FROM golang:1.21-alpine zu ändern, habe aber immer noch den gleichen Fehler erhalten.

Mit von gcr.io/distroless/base-debian11 bekomme ich:

/app/backend/server: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by /app/backend/server)
/app/backend/server: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by /app/backend/server)
/app/backend/server: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /app/backend/server)

Ich habe hier und hier geschaut und vieles ausprobiert. Ich bin relativ neu bei Docker und weiß nicht, wie ich dieses Problem lösen kann. Kann mir jemand helfen zu verstehen, was diesen Fehler verursachen könnte und wie ich ihn beheben kann? Dank im Voraus!

Hier ist meine Docker-Datei:

# Stage 1: Building the application
FROM golang:1.21 AS builder

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download

COPY . ./

RUN apt-get update && apt-get install -y sqlite3 libsqlite3-dev
RUN CGO_ENABLED=1 GOOS=linux go build -a -installsuffix cgo -o /app/backend/server ./backend/backend.go

# Stage 2: Production stage using Alpine
FROM alpine:latest

RUN apk --no-cache add ca-certificates sqlite 

COPY ./backend/configs/config /app/configs/config
COPY ./database/sqlite/schema.sql /app/database/sqlite/schema.sql

COPY ./tls/server.crt /tls/server.crt
COPY ./tls/server.key /tls/server.key

COPY --from=builder /app/backend/server /app/backend/server

EXPOSE 8081

ENTRYPOINT ["/app/backend/server"]

Workaround

Ich habe Ihr Problem mit einer vereinfachten dockerfile und Anwendung nachgebildet (bitte versuchen Sie, ein minimales, reproduzierbares Beispiel bereitzustellen – ich musste erraten, welche SQLite-Bibliothek Sie verwendet haben):

backend.go:

package main

import (
    "database/sql"
    "log"
    "os"

    _ "github.com/mattn/go-sqlite3"
)

func main() {
    os.Remove("./foo.db")

    db, err := sql.Open("sqlite3", "./foo.db")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    sqlStmt := `
    create table foo (id integer not null primary key, name text);
    delete from foo;
    `
    _, err = db.Exec(sqlStmt)
    if err != nil {
        log.Printf("%q: %s\n", err, sqlStmt)
        return
    }
}

dockerfile:

# Stage 1: Building the application
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . ./
RUN apt-get update && apt-get install -y sqlite3 libsqlite3-dev
RUN CGO_ENABLED=1 GOOS=linux go build -a -installsuffix cgo -o /app/server

# Stage 2: Production stage using Alpine
FROM alpine:latest
RUN apk --no-cache add ca-certificates sqlite
COPY --from=builder /app/server /app/server
EXPOSE 8081
ENTRYPOINT ["/app/server"]

Wenn wir eine Shell im Container starten (docker run -it --entrypoint /bin/sh server), können wir sehen, dass die ausführbare Datei vorhanden ist, die Berechtigungen sind in Ordnung, aber sie wird nicht ausgeführt:

/ # ls -al /app/server
-rwxr-xr-x    1 root     root       6816280 Sep 22 02:29 /app/server
/ # /app/server
/bin/sh: /app/server: not found
/ # ldd /app/server
        /lib64/ld-linux-x86-64.so.2 (0x7ff8cb4ba000)
        libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7ff8cb4ba000)
Error relocating /app/server: fcntl64: symbol not found

Es ist leicht, den Fehler „nicht gefunden“ zu sehen und zu denken, dass dies daran liegen muss, dass sich die Datei nicht dort befindet, wo Sie sie erwarten, oder dass sie über falsche Berechtigungen verfügt. Derselbe Fehler wird jedoch angezeigt, wenn etwas fehlt, von dem die ausführbare Datei abhängt. lddldd 显示问题 - 可执行文件依赖于 fcntl64;该库由 glibc 提供,但不是 musl (如 Alpine 中使用的 - glibc musl Anzeigeproblem – ausführbare Datei hängt von fcntl64<a href="https://www.php.cn/link/75800f73fa80f935216b8cfbedf77bfa" rel="noreferrer">;Diese Bibliothek wird von <code>glibc, aber nicht von musl (wie in Alpine verwendet) bereitgestellt – glibc und musl Inkompatibilitäten zwischen Code> sind keine Seltenheit

).

Die einfachste Lösung besteht darin, die Anwendung mit demselben Betriebssystem zu kompilieren, auf dem die Anwendung ausgeführt wird:

# Stage 1: Building the application
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . ./
RUN apk --no-cache add gcc g++ sqlite
RUN CGO_ENABLED=1 GOOS=linux go build -a -installsuffix cgo -o /app/server

# Stage 2: Production stage using Alpine
FROM alpine:latest
RUN apk --no-cache add ca-certificates sqlite
COPY --from=builder /app/server /app/server
EXPOSE 8081
ENTRYPOINT ["/app/server"]

Führen Sie dann Folgendes aus (keine Ausgabe meiner ausführbaren Datei, aber ich habe bestätigt, dass die Datenbank erstellt wurde):

/ # ls -al /app/server
-rwxr-xr-x    1 root     root       6838120 Sep 22 02:39 /app/server
/ # /app/server
/ # ldd /app/server
        /lib/ld-musl-x86_64.so.1 (0x7fabcb701000)
        libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7fabcb701000)
/ # ls -al ./foo.db 
-rw-r--r--    1 root     root          8192 Sep 22 02:40 ./foo.db
Eine weitere Option ist die Verwendung der Pure-Go-Bibliothek

(kein CGO erforderlich). 🎜

Das obige ist der detaillierte Inhalt vonDocker-Ausführungsfehler: exec /app/backend/server: Keine solche Datei oder kein solches Verzeichnis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen