Ralat larian Docker: exec /app/backend/server: Tiada fail atau direktori sedemikian

WBOY
Lepaskan: 2024-02-08 21:21:18
ke hadapan
1118 orang telah melayarinya

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

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.

Kandungan soalan

Saya menghadapi masalah cuba menjalankan bekas Docker. Saya membina imej daripada Dockerfile:

docker build -t server -f ./backend/Dockerfile .
Salin selepas log masuk

Jalankannya:

docker run -it -p 8081:8081 server
Salin selepas log masuk

Ralat berlaku:

exec /app/backend/server: no such file or directory
Salin selepas log masuk

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)
Salin selepas log masuk

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"]
Salin selepas log masuk

Penyelesaian

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
    }
}
Salin selepas log masuk

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"]
Salin selepas log masuk

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
Salin selepas log masuk

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. lddldd 显示问题 - 可执行文件依赖于 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"]
Salin selepas log masuk

Kemudian jalankan ini (tiada output daripada boleh laku saya, tetapi saya mengesahkan pangkalan data telah dibuat):

/ # 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
Salin selepas log masuk
Pilihan lain ialah menggunakan pure go library (tiada CGO diperlukan). 🎜

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan