Some executable files show "no such file or directory" after run in docker, while some are not

huangapple go评论128阅读模式
英文:

Some executable files show "no such file or directory" after run in docker, while some are not

问题

这是我的Dockerfile:

  1. FROM gcr.io/distroless/static:nonroot
  2. WORKDIR /
  3. COPY ls .
  4. COPY tail .
  5. COPY test .
  6. COPY manager .
  7. ENTRYPOINT ["/manager"]

之后执行以下命令:

  1. [root@master go-docker-test]# docker build -t strangething:v1.13 .
  2. [root@master go-docker-test]# docker run -d strangething:v1.13
  3. [root@master go-docker-test]# docker logs b2

显示如下:

  1. exec /manager: no such file or directory

我非常确定它在那里。我使用dive来查看它:

  1. [Layers]───────────────────────────────────────────────────────────────────── [● Current Layer Contents]──────────────────────────────────────────────────
  2. Cmp Image ID Size Command Permission UID:GID Size Filetree
  3. sha256:cb60fb9b862c6a89f9 2.3 MB FROM sha256:cb60fb9b862c6a89f9 drwxr-xr-x 0:0 2.3 MB ├── .
  4. sha256:3e884d7c2d4ba9bac6 118 kB COPY ls . # buildkit drwxr-xr-x 0:0 0 B │ ├── bin
  5. sha256:e75e9da8f1605f7944 67 kB COPY tail . # buildkit drwxr-xr-x 0:0 0 B │ ├── boot
  6. sha256:7a0f1970f36a364672 1.8 MB COPY test . # buildkit drwxr-xr-x 0:0 0 B │ ├── dev
  7. sha256:c9ab59cb1ce11477ca 47 MB COPY manager . # buildkit drwxr-xr-x 0:0 220 kB │ ├─⊕ etc
  8. drwxr-xr-x 65532:65532 0 B ├─⊕ home
  9. [Layer Details]────────────────────────────────────────────────────────────── drwxr-xr-x 0:0 0 B ├── lib
  10. drwxr-xr-x 0:0 0 B ├── proc
  11. Digest: sha256:c9ab59cb1ce11477cac4d634bb81cf7316c344b50f01a62a8e5ddcf355d5fe drwx------ 0:0 0 B ├── root
  12. cf drwxr-xr-x 0:0 0 B ├── run
  13. Tar ID: 998c57d00785ccffaf3b308a529c7f816633897097d1ef6519269a8e3c5af59b drwxr-xr-x 0:0 0 B ├── sbin
  14. Command: drwxr-xr-x 0:0 0 B ├── sys
  15. COPY manager . # buildkit drwxrwxrwx 0:0 0 B │ ├── tmp
  16. drwxr-xr-x 0:0 2.1 MB ├─⊕ usr
  17. [Image Details]────────────────────────────────────────────────────────────── drwxr-xr-x 0:0 1.8 kB └─⊕ var
  18. -rwxr-xr-x 0:0 118 kB ├── ls
  19. Total Image size: 51 MB -rwxr-xr-x 0:0 47 MB ├── manager
  20. Potential wasted space: 0 B -rwxr-xr-x 0:0 67 kB ├── tail
  21. Image efficiency score: 100 % -rwxr-xr-x 0:0 1.8 MB └── test
  22. Count Total Space Path

这个文件树让我有点困惑。

无论如何,奇怪的是,ls tail manager无法执行,但test可以执行。

当我将ENTRYPOINT ["/manager"]更改为ENTRYPOINT ["/test"]后:

  1. [root@master go-docker-test]# docker logs c11
  2. empty

test是由test.go构建的程序,我自己编写了它:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Per struct {
  6. Name string
  7. Age int
  8. }
  9. type Person struct {
  10. Name string
  11. Age int
  12. Lov Per
  13. }
  14. func main() {
  15. var one Person
  16. one.Name="abc"
  17. one.Age=11
  18. var two Per
  19. one.Lov=two
  20. if one.Lov != (Per{}){
  21. fmt.Println("not empty!")
  22. }else {
  23. fmt.Println("empty")
  24. }
  25. }
英文:

This is my Dockerfile:

  1. FROM gcr.io/distroless/static:nonroot
  2. WORKDIR /
  3. COPY ls .
  4. COPY tail .
  5. COPY test .
  6. COPY manager .
  7. ENTRYPOINT ["/manager"]

after

  1. [root@master go-docker-test]# docker build -t strangething:v1.13 .
  2. [root@master go-docker-test]# docker run -d strangething:v1.13
  3. [root@master go-docker-test]# docker logs b2

it shows:

  1. exec /manager: no such file or directory

I'm pretty sure it is there. I use dive to see it:

  1. [Layers]───────────────────────────────────────────────────────────────────── [● Current Layer Contents]──────────────────────────────────────────────────
  2. Cmp Image ID Size Command Permission UID:GID Size Filetree
  3. sha256:cb60fb9b862c6a89f9 2.3 MB FROM sha256:cb60fb9b862c6a89f9 drwxr-xr-x 0:0 2.3 MB ├── .
  4. sha256:3e884d7c2d4ba9bac6 118 kB COPY ls . # buildkit drwxr-xr-x 0:0 0 B │ ├── bin
  5. sha256:e75e9da8f1605f7944 67 kB COPY tail . # buildkit drwxr-xr-x 0:0 0 B │ ├── boot
  6. sha256:7a0f1970f36a364672 1.8 MB COPY test . # buildkit drwxr-xr-x 0:0 0 B │ ├── dev
  7. sha256:c9ab59cb1ce11477ca 47 MB COPY manager . # buildkit drwxr-xr-x 0:0 220 kB │ ├─⊕ etc
  8. drwxr-xr-x 65532:65532 0 B ├─⊕ home
  9. [Layer Details]────────────────────────────────────────────────────────────── drwxr-xr-x 0:0 0 B ├── lib
  10. drwxr-xr-x 0:0 0 B ├── proc
  11. Digest: sha256:c9ab59cb1ce11477cac4d634bb81cf7316c344b50f01a62a8e5ddcf355d5fe drwx------ 0:0 0 B ├── root
  12. cf drwxr-xr-x 0:0 0 B ├── run
  13. Tar ID: 998c57d00785ccffaf3b308a529c7f816633897097d1ef6519269a8e3c5af59b drwxr-xr-x 0:0 0 B ├── sbin
  14. Command: drwxr-xr-x 0:0 0 B ├── sys
  15. COPY manager . # buildkit drwxrwxrwx 0:0 0 B │ ├── tmp
  16. drwxr-xr-x 0:0 2.1 MB ├─⊕ usr
  17. [Image Details]────────────────────────────────────────────────────────────── drwxr-xr-x 0:0 1.8 kB └─⊕ var
  18. -rwxr-xr-x 0:0 118 kB ├── ls
  19. Total Image size: 51 MB -rwxr-xr-x 0:0 47 MB ├── manager
  20. Potential wasted space: 0 B -rwxr-xr-x 0:0 67 kB ├── tail
  21. Image efficiency score: 100 % -rwxr-xr-x 0:0 1.8 MB └── test
  22. Count Total Space Path

This file tree confuses me more or less.

Anyway, strange thing is, ls tail manager can't exec, but testcan exec.

after I change ENTRYPOINT ["/manager"] to ENTRYPOINT ["/test"]:

  1. [root@master go-docker-test]# docker logs c11
  2. empty

test is a program built by test.go, I write it myself:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type Per struct {
  6. Name string
  7. Age int
  8. }
  9. type Person struct {
  10. Name string
  11. Age int
  12. Lov Per
  13. }
  14. func main() {
  15. var one Person
  16. one.Name="abc"
  17. one.Age=11
  18. var two Per
  19. one.Lov=two
  20. if one.Lov != (Per{}){
  21. fmt.Println("not empty!")
  22. }else {
  23. fmt.Println("empty")
  24. }
  25. }

答案1

得分: 3

在阅读了silh的评论和kubebuilder的Dockerfile后,我通过在go build中添加CGO_ENABLED=0来解决了这个问题。这将动态链接器更改为静态链接器。

  1. CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o manager main.go

至少现在已经消除了"no such file or directory"错误。

英文:

After reading silh's comment and the kubebuilder Dockerfile again, I somehow solved this problem by adding CGO_ENABLED=0 to go build. It changes dynamic linker to static linker.

  1. CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o manager main.go

At least the no such file or directory error is now gone.

huangapple
  • 本文由 发表于 2023年2月14日 17:56:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/75446134.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定