亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么找不到二進制 dlv - 沒有這樣的文件或目錄

為什么找不到二進制 dlv - 沒有這樣的文件或目錄

Go
LEATH 2023-03-07 15:25:25
我有一個工作正常的 docker 文件。但是要遠程調試它,我讀到我需要在它上面安裝dlv然后我需要運行 dlv 并傳遞我正在嘗試調試的應用程序的參數。因此,在其上安裝 dlv 并嘗試運行它之后。我得到錯誤exec /dlv: no such file or directory這是泊塢窗文件    FROM golang:1.18-alpine AS builder# Build Delve for debuggingRUN go install github.com/go-delve/delve/cmd/dlv@latest# Create and change to the app directory.WORKDIR /appENV CGO_ENABLED=0# Retrieve application dependencies.COPY go.* ./RUN go mod download# Copy local code to the container image.COPY . ./# Build the binary.RUN go build -gcflags="all=-N -l" -o fooapp# Use the official Debian slim image for a lean production container.FROM debian:buster-slimEXPOSE 8000 40000RUN set -x && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \    ca-certificates && \    rm -rf /var/lib/apt/lists/*# Copy the binary to the production image from the builder stage.#COPY --from=builder /app/fooapp /app/fooapp #commented this out  COPY --from=builder /go/bin/dlv /dlv# Run dlv as pass fooapp as parameterCMD ["/dlv", "--listen=:40000", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "/app/fooapp"]以上結果exec /dlv: no such file or directory我不確定為什么會這樣。作為 docker 的新手,我嘗試了不同的方法來調試它。我試著用它dive來檢查圖像是否dlv在路徑中/dlv,它確實如此。我還附上了它的圖片
查看完整描述

2 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

您構建了dlv基于alpine- 的發行版。dlv可執行文件鏈接到libc.musl:


# ldd dlv 

        linux-vdso.so.1 (0x00007ffcd251d000)

        libc.musl-x86_64.so.1 => not found

但是后來你切換到glibc基于圖像debian:buster-slim。該圖像沒有所需的庫。


# find / -name libc.musl*                                        

<nothing found>

這就是您無法執行的原因dlv- 動態鏈接器無法找到正確的庫。


您需要構建glibc基于 - 的 docker。例如,替換第一行


FROM golang:bullseye AS builder

順便提一句。構建后,您需要以特權模式運行容器


$ docker build . -t try-dlv

...

$ docker run --privileged --rm try-dlv

API server listening at: [::]:40000

2022-10-30T10:51:02Z warning layer=rpc Listening for remote connections (connections are not authenticated nor encrypted)

在非特權容器中dlv不允許產生子進程。


$ docker run --rm try-dlv

API server listening at: [::]:40000

2022-10-30T10:55:46Z warning layer=rpc Listening for remote connections (connections are not authenticated nor encrypted)

could not launch process: fork/exec /app/fooapp: operation not permitted

真正最小的圖像


你用來debian:buster-slim最小化圖像,它的大小是 80 MB。但是如果你需要一個非常小的圖像,使用busybox,它只有 4.86 MB 的開銷。


FROM golang:bullseye AS builder


# Build Delve for debugging

RUN go install github.com/go-delve/delve/cmd/dlv@latest


# Create and change to the app directory.

WORKDIR /app

ENV CGO_ENABLED=0


# Retrieve application dependencies.

COPY go.* ./

RUN go mod download


# Copy local code to the container image.

COPY . ./


# Build the binary.

RUN go build -o fooapp .


# Download certificates

RUN set -x && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \

    ca-certificates 


# Use the official Debian slim image for a lean production container.

FROM busybox:glibc


EXPOSE 8000 40000


# Copy the binary to the production image from the builder stage.

COPY --from=builder /app/fooapp /app/fooapp 

# COPY --from=builder /app/ /app


COPY --from=builder /go/bin/dlv /dlv


COPY --from=builder /etc/ssl /etc/ssl


# Run dlv as pass fooapp as parameter

CMD ["/dlv", "--listen=:40000", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "/app/fooapp"]

# ENTRYPOINT ["/bin/sh"]

圖像大小為 25 MB,其中 18 MB 來自應用程序dlv,2 MB 來自Hello World應用程序。


在選擇圖像時,應注意具有相同風格的libc. golang:bullseye針對glibc. 因此,最小圖像必須glibc基于。


但是,如果您想要更舒適一些,請使用已安裝的alpine軟件包gcompat。與busybox.


FROM golang:bullseye AS builder


# Build Delve for debugging

RUN go install github.com/go-delve/delve/cmd/dlv@latest


# Create and change to the app directory.

WORKDIR /app

ENV CGO_ENABLED=0


# Copy local code to the container image.

COPY . ./


# Retrieve application dependencies.

RUN go mod tidy


# Build the binary.

RUN go build -o fooapp .


# Use alpine lean production container.

# FROM busybox:glibc

FROM alpine:latest


# gcompat is the package to glibc-based apps

# ca-certificates contains trusted TLS CA certs

# bash is just for the comfort, I hate /bin/sh

RUN apk add gcompat ca-certificates bash


EXPOSE 8000 40000


# Copy the binary to the production image from the builder stage.

COPY --from=builder /app/fooapp /app/fooapp 

# COPY --from=builder /app/ /app


COPY --from=builder /go/bin/dlv /dlv


# Run dlv as pass fooapp as parameter

CMD ["/dlv", "--listen=:40000", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "/app/fooapp"]

# ENTRYPOINT ["/bin/bash"]


查看完整回答
反對 回復 2023-03-07
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

長話短說

運行apt-get install musl,然后/dlv應該按預期工作。

解釋

按著這些次序:

  1. docker run -it <image-name> sh

  2. apt-get install file

  3. file /dlv

然后你可以看到如下輸出:

/dlv: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-x86_64.so.1, Go BuildID=xV8RHgfpp-zlDlpElKQb/DOLzpvO_A6CJb7sj1Nxf/aCHlNjW4ruS1RXQUbuCC/JgrF83mgm55ntjRnBpHH, not stripped

令人困惑no such file or directory(有關相關討論,請參閱此問題)是由 missing 引起的/lib/ld-musl-x86_64.so.1。

因此,解決方案是musl按照其文檔安裝庫。

我的回答是受這個答案的啟發。


查看完整回答
反對 回復 2023-03-07
  • 2 回答
  • 0 關注
  • 241 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號