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.
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"]
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. ldd
ldd
显示问题 - 可执行文件依赖于 fcntl64
;该库由 glibc
提供,但不是 musl
(如 Alpine 中使用的 - glibc
和 musl
Anzeigeproblem – ausführbare Datei hängt von fcntl64< /code ab ><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"]
/ # 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
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!