【问题标题】:Golang Dockerfile FailingGolang Dockerfile 失败
【发布时间】:2016-10-25 05:38:49
【问题描述】:

我有一个希望在 Docker 容器中运行的 Golang Web 应用程序。我可以在容器外很好地运行它,所以我知道它可以工作,但是当我从 Dockerfile 构建它并运行它时,它给了我一个错误。

Makefile 如下所示

GOCMD = go
GOBUILD = $(GOCMD) build
GOGET = $(GOCMD) get -v
GOCLEAN = $(GOCMD) clean
GOINSTALL = $(GOCMD) install
GOTEST = $(GOCMD) test

.PHONY: all

all: build

test:
    $(GOTEST) -v -cover ./...

build:
    $(GOGET); $(GOBUILD) -v -o engine

clean:
    $(GOCLEAN) -n -i -x
    rm -f $(GOPATH)/bin/engine
    rm -rf bin/engine

install: 
    $(GOINSTALL)

Dockerfile 如下所示

FROM golang

ADD engine /go/bin/engine

EXPOSE 7777

ENTRYPOINT /go/bin/engine

我正在构建映像并使用以下命令运行它

docker build -t engine .
docker run -d --name engine -p 7777:7777 engine

它给了我以下错误

/go/bin/engine: 1: /go/bin/engine: Syntax error: "(" unexpected

【问题讨论】:

  • 问:为什么要在容器内构建 Go?为什么不使用 Dockerfile 引入的预构建二进制文件?
  • 在容器中构建它对我来说更有意义。似乎有助于确保构建更加一致。
  • 查看blog.golang.org/docker 在我看来,您的 docker 文件中缺少一些设置。
  • @elithrar 这就是我想要做的
  • @JoshWilson 我已经在容器中得到了这个工作良好的建筑,但出于优化目的,我希望能够将二进制文件传递到 dockerfile 中

标签: go docker dockerfile


【解决方案1】:

当您构建二进制文件时,go build 假定您正在尝试为您当前的计算机构建,它会为您选择 GOOSGOARCH (described here) 的值。

如果您不是在 linux 机器上构建,那么您需要交叉编译 linux 的二进制文件,因为这是 docker 容器内的操作系统将运行的。 Explanation here

你需要这样的东西:

GOOS=linux

build:
    $(GOGET); GOOS=$(GOOS) $(GOBUILD) -v -o engine

【讨论】:

    猜你喜欢
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2018-01-19
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多