Не удается создать образ для приложения Golang с помощью Docker

#docker #go #dockerfile

#docker #Вперед #dockerfile

Вопрос:

Я пытаюсь создать образ для моего приложения Golang, но Docker просто пишет:

 Step 7/9 : RUN go install ./accounting/server
 ---> Running in f998ba6a5efb
can't load package: package grpcProjects/multiService/accounting/server: cannot find package "grpcProjects/multiService/accounting/server" in any of:
        /usr/local/go/src/grpcProjects/multiService/accounting/server (from $GOROOT)
        /go/src/grpcProjects/multiService/accounting/server (from $GOPATH)
  

Мой файл Dockerfile:

 FROM golang:1.10.4

ADD . /go/src/grpcProjects/multiService

WORKDIR /go/src/grpcProjects/multiService

RUN go get github.com/golang/protobuf/proto
RUN go get golang.org/x/net/context
RUN go get google.golang.org/grpc
RUN go install ./accounting/server

ENTRYPOINT [ "/go/bin/server" ]

EXPOSE 8080
  

Структура проекта:

введите описание изображения здесь

Как решить эту проблему?

Комментарии:

1. Работает ли эта команда go install ./accounting/server у вас, когда вы запускаете ее локально?

2. @Nik да, это так.

3. Возможно, вы хотите заменить команду ADD на COPY в Dockerfile, а также дважды проверить, есть ли какой-либо файл .dockerignore, предотвращающий копирование серверного пакета.

Ответ №1:

Я нашел решение. Все пошло не так, потому что я использовал эту команду из корневого каталога проекта:

 $ docker build -t accounting_server ./accounting
  

И multiService/accounting был моим каталогом сборки, поэтому иерархия файлов в изображении выглядела следующим образом:

 /go/src/grpcProjects/multiService
/go/src/grpcProjects/multiService/server
/go/src/grpcProjects/multiService/server/service
/go/src/grpcProjects/multiService/server/service/accounting.go
/go/src/grpcProjects/multiService/server/main.go
/go/src/grpcProjects/multiService/proto
/go/src/grpcProjects/multiService/proto/accounting.proto
/go/src/grpcProjects/multiService/proto/accounting.pb.go
/go/src/grpcProjects/multiService/Dockerfile
  

Docker просто скопировал содержимое local /multiService/accounting в /multiService каталог образа. Поэтому мне пришлось немного изменить Dockerfile:

 FROM golang:1.10.4

ADD . /go/src/grpcProjects/multiService

RUN go get github.com/golang/protobuf/proto
RUN go get golang.org/x/net/context
RUN go get google.golang.org/grpc
RUN go install grpcProjects/multiService/accounting/server

ENTRYPOINT [ "/go/bin/server" ]

EXPOSE 8080
  

И я создал свой контейнер с помощью следующей команды:

 $ docker build -t accounting_server -f ./accounting/Dockerfile .
  

Все еще из корневого каталога, поэтому все было скопировано в изображение должным образом.

Спасибо всем, кто ответил!