Docker 執行錯誤:exec /app/backend/server:沒有這樣的檔案或目錄

WBOY
發布: 2024-02-08 21:21:18
轉載
940 人瀏覽過

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

在使用Docker時,有時會遇到一些執行錯誤,例如出現了"exec /app/backend/server:沒有這樣的檔案或目錄"的錯誤提示。這個錯誤可能會讓人感到困惑,不知道該如何解決。針對這個問題,php小編魚仔為大家提供了一些解決方法,希望能幫助大家。接下來,我們就一起來看看如何解決這個問題。

問題內容

我在嘗試執行 Docker 容器時遇到問題。我從 Dockerfile 建立了一個映像:

docker build -t server -f ./backend/Dockerfile .
登入後複製

運行它:

docker run -it -p 8081:8081 server
登入後複製

出現錯誤:

exec /app/backend/server: no such file or directory
登入後複製

當我從 Docker Desktop 進行檢查時,我會在容器內看到該檔案存在,並且已按照應有的位置建立到該位置。

我還嘗試更改第二階段FROM golang:1.21-alpine,但仍然遇到相同的錯誤。

隨著來自 gcr.io/distroless/base-debian11我得到:

/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)
登入後複製

我看了這裡、這裡並嘗試了很多東西。我對 Docker 比較陌生,不知道該如何解決這個問題。有人可以幫助我了解可能導致此錯誤的原因以及如何解決它嗎?先致謝!

下面是我的 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/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"]
登入後複製

解決方法

我用簡化的dockerfile和應用程式複製了您的問題(請嘗試提供最小、可重現的範例-我必須猜測你正在使用哪個sqlite 函式庫):

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"]
登入後複製
在容器中啟動一個shell(docker run -it --entrypoint /bin/sh server

)我們可以看到可執行檔在那裡,權限很好,但它不運行:

/ # 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
登入後複製
很容易看到錯誤“未找到”,並認為這一定是由於文件不在您期望的位置,或者權限不正確。但是,當可執行檔所依賴的內容遺失時,會顯示相同的錯誤。ldd 顯示問題- 可執行檔依賴fcntl64 ;該函式庫由glibc 提供,但不是musl (如Alpine 中使用的 -glibc musl 之間的不相容性是並不罕見

)。

最簡單的解決方案是使用與運行應用程式相同的作業系統來編譯應用程式:

# 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
登入後複製
另一種選擇是使用pure go 庫(無需 CGO )。 ###

以上是Docker 執行錯誤:exec /app/backend/server:沒有這樣的檔案或目錄的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!