英文:
Some executable files show "no such file or directory" after run in docker, while some are not
问题
这是我的Dockerfile:
FROM gcr.io/distroless/static:nonroot
WORKDIR /
COPY ls .
COPY tail .
COPY test .
COPY manager .
ENTRYPOINT ["/manager"]
之后执行以下命令:
[root@master go-docker-test]# docker build -t strangething:v1.13 .
[root@master go-docker-test]# docker run -d strangething:v1.13
[root@master go-docker-test]# docker logs b2
显示如下:
exec /manager: no such file or directory
我非常确定它在那里。我使用dive来查看它:
[Layers]───────────────────────────────────────────────────────────────────── [● Current Layer Contents]──────────────────────────────────────────────────
Cmp Image ID Size Command Permission UID:GID Size Filetree
sha256:cb60fb9b862c6a89f9 2.3 MB FROM sha256:cb60fb9b862c6a89f9 drwxr-xr-x 0:0 2.3 MB ├── .
sha256:3e884d7c2d4ba9bac6 118 kB COPY ls . # buildkit drwxr-xr-x 0:0 0 B │ ├── bin
sha256:e75e9da8f1605f7944 67 kB COPY tail . # buildkit drwxr-xr-x 0:0 0 B │ ├── boot
sha256:7a0f1970f36a364672 1.8 MB COPY test . # buildkit drwxr-xr-x 0:0 0 B │ ├── dev
sha256:c9ab59cb1ce11477ca 47 MB COPY manager . # buildkit drwxr-xr-x 0:0 220 kB │ ├─⊕ etc
drwxr-xr-x 65532:65532 0 B │ ├─⊕ home
[Layer Details]────────────────────────────────────────────────────────────── drwxr-xr-x 0:0 0 B │ ├── lib
drwxr-xr-x 0:0 0 B │ ├── proc
Digest: sha256:c9ab59cb1ce11477cac4d634bb81cf7316c344b50f01a62a8e5ddcf355d5fe drwx------ 0:0 0 B │ ├── root
cf drwxr-xr-x 0:0 0 B │ ├── run
Tar ID: 998c57d00785ccffaf3b308a529c7f816633897097d1ef6519269a8e3c5af59b drwxr-xr-x 0:0 0 B │ ├── sbin
Command: drwxr-xr-x 0:0 0 B │ ├── sys
COPY manager . # buildkit drwxrwxrwx 0:0 0 B │ ├── tmp
drwxr-xr-x 0:0 2.1 MB │ ├─⊕ usr
[Image Details]────────────────────────────────────────────────────────────── drwxr-xr-x 0:0 1.8 kB │ └─⊕ var
-rwxr-xr-x 0:0 118 kB ├── ls
Total Image size: 51 MB -rwxr-xr-x 0:0 47 MB ├── manager
Potential wasted space: 0 B -rwxr-xr-x 0:0 67 kB ├── tail
Image efficiency score: 100 % -rwxr-xr-x 0:0 1.8 MB └── test
Count Total Space Path
这个文件树让我有点困惑。
无论如何,奇怪的是,ls tail manager
无法执行,但test
可以执行。
当我将ENTRYPOINT ["/manager"]
更改为ENTRYPOINT ["/test"]
后:
[root@master go-docker-test]# docker logs c11
empty
test
是由test.go构建的程序,我自己编写了它:
package main
import (
"fmt"
)
type Per struct {
Name string
Age int
}
type Person struct {
Name string
Age int
Lov Per
}
func main() {
var one Person
one.Name="abc"
one.Age=11
var two Per
one.Lov=two
if one.Lov != (Per{}){
fmt.Println("not empty!")
}else {
fmt.Println("empty")
}
}
英文:
This is my Dockerfile:
FROM gcr.io/distroless/static:nonroot
WORKDIR /
COPY ls .
COPY tail .
COPY test .
COPY manager .
ENTRYPOINT ["/manager"]
after
[root@master go-docker-test]# docker build -t strangething:v1.13 .
[root@master go-docker-test]# docker run -d strangething:v1.13
[root@master go-docker-test]# docker logs b2
it shows:
exec /manager: no such file or directory
I'm pretty sure it is there. I use dive to see it:
[Layers]───────────────────────────────────────────────────────────────────── [● Current Layer Contents]──────────────────────────────────────────────────
Cmp Image ID Size Command Permission UID:GID Size Filetree
sha256:cb60fb9b862c6a89f9 2.3 MB FROM sha256:cb60fb9b862c6a89f9 drwxr-xr-x 0:0 2.3 MB ├── .
sha256:3e884d7c2d4ba9bac6 118 kB COPY ls . # buildkit drwxr-xr-x 0:0 0 B │ ├── bin
sha256:e75e9da8f1605f7944 67 kB COPY tail . # buildkit drwxr-xr-x 0:0 0 B │ ├── boot
sha256:7a0f1970f36a364672 1.8 MB COPY test . # buildkit drwxr-xr-x 0:0 0 B │ ├── dev
sha256:c9ab59cb1ce11477ca 47 MB COPY manager . # buildkit drwxr-xr-x 0:0 220 kB │ ├─⊕ etc
drwxr-xr-x 65532:65532 0 B │ ├─⊕ home
[Layer Details]────────────────────────────────────────────────────────────── drwxr-xr-x 0:0 0 B │ ├── lib
drwxr-xr-x 0:0 0 B │ ├── proc
Digest: sha256:c9ab59cb1ce11477cac4d634bb81cf7316c344b50f01a62a8e5ddcf355d5fe drwx------ 0:0 0 B │ ├── root
cf drwxr-xr-x 0:0 0 B │ ├── run
Tar ID: 998c57d00785ccffaf3b308a529c7f816633897097d1ef6519269a8e3c5af59b drwxr-xr-x 0:0 0 B │ ├── sbin
Command: drwxr-xr-x 0:0 0 B │ ├── sys
COPY manager . # buildkit drwxrwxrwx 0:0 0 B │ ├── tmp
drwxr-xr-x 0:0 2.1 MB │ ├─⊕ usr
[Image Details]────────────────────────────────────────────────────────────── drwxr-xr-x 0:0 1.8 kB │ └─⊕ var
-rwxr-xr-x 0:0 118 kB ├── ls
Total Image size: 51 MB -rwxr-xr-x 0:0 47 MB ├── manager
Potential wasted space: 0 B -rwxr-xr-x 0:0 67 kB ├── tail
Image efficiency score: 100 % -rwxr-xr-x 0:0 1.8 MB └── test
Count Total Space Path
This file tree confuses me more or less.
Anyway, strange thing is, ls tail manager
can't exec, but test
can exec.
after I change ENTRYPOINT ["/manager"]
to ENTRYPOINT ["/test"]
:
[root@master go-docker-test]# docker logs c11
empty
test is a program built by test.go, I write it myself:
package main
import (
"fmt"
)
type Per struct {
Name string
Age int
}
type Person struct {
Name string
Age int
Lov Per
}
func main() {
var one Person
one.Name="abc"
one.Age=11
var two Per
one.Lov=two
if one.Lov != (Per{}){
fmt.Println("not empty!")
}else {
fmt.Println("empty")
}
}
答案1
得分: 3
在阅读了silh的评论和kubebuilder的Dockerfile后,我通过在go build中添加CGO_ENABLED=0来解决了这个问题。这将动态链接器更改为静态链接器。
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.
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论