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

我按照使用 BusyBox Docker 图像构建应用程序:自定义图像的完整指南。

使用代码docker-busybox-example

文件

# Use busybox as the base image

FROM busybox

# Copy over the executable file

COPY ./server /home/server

# Run the executable file

CMD /home/server

网络服务器


package main


import (

    "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找不到。我对此一无所知。

它不支持网络服务器可执行文件吗?


慕标5832272
浏览 96回答 1
1回答

江户川乱折腾

你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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go