为了账号安全,请及时绑定邮箱和手机立即绑定

将 Web 服务器命令复制到图像但在运行容器时未找到

将 Web 服务器命令复制到图像但在运行容器时未找到

Go
慕标5832272 2023-02-28 20:29:20
我按照使用 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。


查看完整回答
反对 回复 2023-02-28
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信