Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat larian Docker: exec /app/backend/server: Tiada fail atau direktori sedemikian

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

WBOY
WBOYke hadapan
2024-02-08 21:21:18997semak imbas

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 .

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

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
    }
}

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. lddldd 显示问题 - 可执行文件依赖于 fcntl64;该库由 glibc 提供,但不是 musl (如 Alpine 中使用的 - glibc musl Masalah paparan - boleh laku bergantung pada fcntl64<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"]

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
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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam