我按照使用 BusyBox Docker 图像构建应用程序:自定义图像的完整指南。使用代码docker-busybox-example。文件# Use busybox as the base imageFROM busybox# Copy over the executable fileCOPY ./server /home/server# Run the executable fileCMD /home/server网络服务器package mainimport ( "fmt" "net/http")func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World!")}func main() { http.HandleFunc("/", handler) fmt.Println("Server running...") http.ListenAndServe(":8080", nil)}编译为可执行server文件GOOS=linux GOARCH=amd64 go build server.go构建基于图像的busybox[mymachine@localhost tmp]$ docker image build -t go-server . Sending build context to Docker daemon 6.562MB Step 1/3 : FROM busybox ---> beae173ccac6 Step 2/3 : COPY ./server /home/server ---> Using cache ---> 9d58653768ea Step 3/3 : CMD /home/server ---> Running in 994cce171c11 Removing intermediate container 994cce171c11 ---> 38996797b6d8 Successfully built 38996797b6d8 Successfully tagged go-server:latest *当运行容器时,server找不到。我对此一无所知。它不支持网络服务器可执行文件吗?
1 回答
江户川乱折腾
TA贡献1851条经验 获得超5个赞
你server
是一个动态的可执行文件......
$ ldd server linux-vdso.so.1 (0x00007ffcbdbd2000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f3a78527000) libc.so.6 => /lib64/libc.so.6 (0x00007f3a78325000) /lib64/ld-linux-x86-64.so.2 (0x00007f3a78554000)
...并且busybox
图像没有任何必需的运行时库。一种解决方案是使用 busybox 以外的东西,例如:
FROM ubuntu:22.04 COPY ./server /home/server CMD ["/home/server"]
(我已经CMD
在此处修改了您的声明,以便可以使用 终止容器CTRL-C
。)
另一种选择是构建静态可执行文件:
$ CGO_ENABLED=0 go build $ ldd server not a dynamic executable
这适用于您的原始 Dockerfile。
- 1 回答
- 0 关注
- 95 浏览
添加回答
举报
0/150
提交
取消