2016-06-23 4 views
0

У меня есть веб-приложение Golang, которое я ищу для запуска в контейнере Docker. Я могу запустить его отлично за пределами контейнера, поэтому я знаю, что он работает, но когда я его создаю с Dockerfile и запускаю его, он дает мне ошибку.Golang Dockerfile Failing

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 
+1

Q: почему построить Go внутри контейнера? Почему у вас нет встроенного бинарного файла, в который входит ваш Dockerfile? – elithrar

+0

Построение его в контейнере имеет для меня больше смысла. Кажется, чтобы обеспечить более последовательную сборку. –

+1

Отъезд https://blog.golang.org/docker Мне кажется, что вам не хватает настройки в вашем файле докеров. –

ответ

0

При создании двоичного кода, go build предполагает, что вы пытаетесь построить для текущего компьютера, он выбирает значения GOOS и GOARCH (described here) для вас.

Если вы не строите машину linux, вам нужно будет скомпилировать двоичный файл для linux, так как это будет работать ОС внутри контейнера докеров. Explanation here

Вам нужно что-то вроде:

GOOS=linux 

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