首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未找到静态Go二进制文件w/ Docker -入口点

未找到静态Go二进制文件w/ Docker -入口点
EN

Stack Overflow用户
提问于 2016-08-01 19:42:00
回答 1查看 1.1K关注 0票数 0

我使用了Nicola的OSX上带有Docker的静态Go二进制文件来尝试使用静态Go二进制w/ Docker。我相信我正确地执行了每一步,但是当我运行最后的映像时,我从Docker获得了以下错误响应。

注意,我的服务和可执行文件的名称是netverify

代码语言:javascript
复制
docker: Error response from daemon: Container command '/netverify' not found or does not exist..

我的Dockerfile.static看起来如下..。

代码语言:javascript
复制
#Create a minimal container to run a Golang static binary

FROM tianon/true
ADD netverify /
EXPOSE 8282
CMD ["/netverify"]

我的Dockerfile.build看起来如下..。

代码语言:javascript
复制
FROM golang

ADD Makefile /
WORKDIR /
RUN make setup

ADD . /go/src/github.com/eirwin/netverify

RUN make buildgo
CMD ["/bin/bash"]

我的Makefile如下..。

代码语言:javascript
复制
GOCMD = go
GOBUILD = $(GOCMD) build
GOGET = $(GOCMD) get -v
GOCLEAN = $(GOCMD) clean
GOINSTALL = $(GOCMD) install
GOTEST = $(GOCMD) test

.PHONY: all

all: build

setup:
    $(GOGET) github.com/gorilla/mux

buildgo:
    GOOS=linux $(GOBUILD) -o netverify ./go/src/github.com/eirwin/netverify

builddocker:
    docker build -t eirwin/netverify -f ./Dockerfile.build .
    docker run -t eirwin/netverify /bin/true
    docker cp `docker ps -q -n=1`:/netverify .
    chmod 755 ./netverify
    docker build --rm=true --tag=eirwin/netverify -f Dockerfile.static .

run:    builddocker
    docker run -p 8282:8282 eirwin/netverify    

为了这篇文章的目的,让我们假设我有以下作为我的戈朗应用程序。

代码语言:javascript
复制
func main() {

    router := mux.NewRouter()
    router.HandleFunc("/ping", api.PingHandler).Methods("GET")
    http.ListenAndServe(":8282", router)
}

当我运行Make run时,除了运行映像之外,一切似乎都正常。

我可以看到,映像在~8.5MB时构建正确。

代码语言:javascript
复制
eirwin/netverify  latest  eae16e146b91 3 seconds ago       8.63 MB

但是如果运行docker run -p 8282:8282 eirwin/netverify,我会得到以下错误.

代码语言:javascript
复制
docker: Error response from daemon: Container command '/netverify' not found or does not exist..
EN

回答 1

Stack Overflow用户

发布于 2016-08-02 02:48:27

makefile中的go静态构建缺少一些选项。

代码语言:javascript
复制
buildgo:
    CGO_ENABLED=0 GOOS=linux go build -ldflags "-s" -a -installsuffix cgo -o netverify ./go/src/github.com/eirwin/netverify

构建过程可以捕获容器ID以避免计时问题。

分离生成和二进制图像的标记。

代码语言:javascript
复制
builddocker:
    docker build -t eirwin/netverify-build -f ./Dockerfile.build .
    CID=$$(docker create eirwin/netverify-build); \
    docker cp $$CID:/netverify .; \
    docker rm $$CID
    chmod 755 ./netverify
    docker build --rm=true --tag=eirwin/netverify -f Dockerfile.static .

二进制Dockerfile.static可以从scratch空白图像开始。

代码语言:javascript
复制
FROM scratch
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38706880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档