Ich versuche, eine Go-Anwendung wie folgt zu erstellen. Meine main.go-Datei befindet sich in cmd/app/main.go.
Aber wenn ich versuche zu rennen docker build --no-cache .
和 docker 运行 <container_id>
.
Es hat mir exec ./bin/app: 没有这样的文件或目录
Ich habe das Laufen getestet go build -o ./bin/app ./cmd/app
和 ./bin/app
und es funktioniert korrekt.
Das ist meine Docker-Datei
# build phase from golang:1.20 as builder workdir /app copy go.mod go.sum ./ run go mod download && go mod verify copy . . run go build -o ./bin/app ./cmd/app # production phase from alpine:3.14 workdir /app copy --from=builder /app/bin/app ./bin/app entrypoint [ "./bin/app" ]
Ich versuche, auf den Container zuzugreifen docker run -it -t fyno/server/multi /bin/sh
/app # cd bin /app/bin # ls -la total 11636 drwxr-xr-x 2 root root 4096 Apr 12 05:04 . drwxr-xr-x 1 root root 4096 Apr 12 05:04 .. -rwxr-xr-x 1 root root 11904381 Apr 12 05:04 app /app/bin # ./app /bin/sh: ./app: not found /app/bin #
Vielen Dank.
Wie kann dieses Problem gelöst werden?
Zuallererst gibt es ein Problem mit dem Pfad, das den Fehler „Keine solche Datei oder kein solches Verzeichnis“ verursacht.
Ich habe ein minimales -Verzeichnis geschrieben. Ich hoffe, dass es jetzt mehr Sinn ergibt.
dockerfile
示例,并重命名了 app
二进制文件,这导致了混乱,因为它位于示例中的 app
Zweitens, nachdem Sie die Pfadungenauigkeit in
nicht gefundendockerfile
, weil das Golang-Builder-Image debian glibc 2.31-13+ deb11u5 2.31 verwendet, while Das Runner-Image verwendet musl libc (x86_64)
Version 1.2.2.
Die einfachste Lösung besteht darin,
Für ähnliche Probleme werden cgo_enabled=0
。如果你确实想使用 cgo
hier
mehrere Alternativen und Workarounds bereitgestellt.
Drittens haben Sie in Ihren Kommentaren auch
. ├── cmd │ └── main.go ├── dockerfile ├── go.mod └── go.sum
.env
文件,因此我还在 mvp 中添加了一个简单的读取显示,用于使用 docker run --env ...
# build phase from golang:1.20 as builder # next line is just for debug run ldd --version workdir /build copy go.mod go.sum ./ run go mod download && go mod verify copy . . workdir /build/cmd run cgo_enabled=0 goos=linux goarch=amd64 go build -o go-binary # production phase from alpine:3.14 # next line is just for debug run ldd; exit 0 workdir /app copy --from=builder /build/cmd/go-binary . entrypoint [ "/app/go-binary"]
dockerfile:
package main import ( "os" "time" "github.com/rs/zerolog/log" ) func main() { yourvar := os.getenv("your_var") for { time.sleep(time.second) log.info().msg(yourvar) } }
main.go:
Erstellen und ausführen:
docker build --no-cache -t stack-overflow-go-docker:v1.0 . docker run --env your_var=your-value stack-overflow-go-docker:v1.0
{"level":"info","time":"2023-04-14T21:12:37Z","message":"your-value"} {"level":"info","time":"2023-04-14T21:12:38Z","message":"your-value"}
Das obige ist der detaillierte Inhalt vonGo Binary kann mit dem mehrstufigen Docker-Build nicht ausgeführt werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!