Apabila menggunakan Docker, anda kadangkala menghadapi beberapa ralat berjalan, seperti mesej ralat "exec /app/backend/server: No such file or directory". Ralat ini boleh menyebabkan orang keliru tentang cara membetulkannya. Sebagai tindak balas kepada masalah ini, editor PHP Yuzai telah menyediakan beberapa penyelesaian untuk semua orang, dengan harapan dapat membantu semua orang. Seterusnya, mari kita lihat bagaimana untuk menyelesaikan masalah ini.
Saya menghadapi masalah cuba menjalankan bekas Docker. Saya membina imej daripada Dockerfile:
docker build -t server -f ./backend/Dockerfile .
Jalankannya:
docker run -it -p 8081:8081 server
Ralat berlaku:
exec /app/backend/server: no such file or directory
Apabila saya menyemak dari Docker Desktop, saya melihat bahawa fail itu wujud di dalam bekas dan telah dibuat ke lokasi yang sepatutnya.
Saya juga cuba menukar peringkat kedua DARI golang:1.21-alpine tetapi masih mendapat ralat yang sama.
Dengan dari gcr.io/distroless/base-debian11 saya mendapat:
/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)
Saya melihat di sini, di sini dan mencuba banyak perkara. Saya agak baru untuk Docker dan tidak tahu bagaimana untuk menyelesaikan masalah ini. Bolehkah sesiapa membantu saya memahami apa yang mungkin menyebabkan ralat ini dan cara membetulkannya? Terima kasih terlebih dahulu!
Ini ialah Dockerfile saya:
# 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"]
Saya meniru masalah anda dengan dockerfile
dan aplikasi yang dipermudahkan (sila cuba berikan contoh yang minimum, boleh dihasilkan semula - Saya terpaksa meneka perpustakaan sqlite yang anda gunakan):
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"]
Memulakan shell dalam bekas (docker run -it --entrypoint /bin/sh server
) kita dapat melihat executable ada di sana, kebenarannya baik, tetapi ia tidak berjalan:
/ # 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
Mudah untuk melihat ralat "tidak ditemui" dan fikir ia mesti disebabkan oleh fail tidak berada di tempat yang anda jangkakan, atau mempunyai kebenaran yang salah. Walau bagaimanapun, ralat yang sama dipaparkan apabila sesuatu yang bergantung pada boleh laku hilang. ldd
fcntl64
;该库由 glibc
提供,但不是 musl
(如 Alpine 中使用的 - glibc
和 musl
Masalah paparan - boleh laku bergantung pada fcntl64< /kod ><a href="https://www.php.cn/link/75800f73fa80f935216b8cfbedf77bfa" rel="noreferrer">;Pustaka ini disediakan oleh <code>glibc
tetapi bukan musl
(seperti yang digunakan dalam Alpine - glibc
dan musl
Ketidakserasian antara kod> adalah tidak biasa
Penyelesaian paling mudah adalah untuk menyusun aplikasi menggunakan sistem pengendalian yang sama dengan aplikasi yang dijalankan:
# 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
Atas ialah kandungan terperinci Ralat larian Docker: exec /app/backend/server: Tiada fail atau direktori sedemikian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!