Как правильно запустить приложение golang в докере? - PullRequest
1 голос
/ 11 марта 2019

Я разработал приложение Golang в Windows 10. На моем локальном компьютере оно работает нормально.Я удаляю исходный код на удаленный сервер CentOS, на котором есть Docker.Прямо сейчас я пытаюсь запустить это приложение в Docker.

Я создал Dockerfile в той же папке, где находится main.go файл.

- questionnaire
    - database
    - routes
    - utils
    - models
    - controllers
      main.go
      Dockerfile

Dockerfile выглядит примерно так:

FROM golang:1.12

RUN go get github.com/gorilla/mux && \
  go get github.com/gorilla/handlers && \
  go get github.com/lib/pq && \
  go get github.com/joho/godotenv && \
  go get github.com/jinzhu/gorm && \
  go get github.com/go-goracle/goracle

COPY / ./

EXPOSE 8000

CMD ["go", "run", "main.go"]

Мой main.go файл выглядит довольно просто:

package main

import (
  "github.com/gorilla/handlers"
  "github.com/gorilla/mux"
  "github.com/joho/godotenv"
  "log"
  "net/http"
  "questionnaire/database"
  "questionnaire/routes"
  "questionnaire/utils"
)

func main()  {
  err := godotenv.Load(".env")
  if err != nil {
    panic(err)
  }

  database.ConnectOracle()
  defer database.DisconnectOracle()

  router := mux.NewRouter()

  headers := handlers.AllowedHeaders([]string{"X-Requested-With", "Content-Type", "Authorization"})
  methods := handlers.AllowedMethods([]string{"GET", "POST", "PATCH", "PUT", "DELETE", "OPTIONS"})
  origins := handlers.AllowedOrigins([]string{"*"})

  router.StrictSlash(true)

  routes.Handle(router)

  port := utils.CheckEnvironmentVariable("APPLICATION_PORT")

  log.Printf("RESTful web service is running on %s port.", port)

  log.Fatal(http.ListenAndServe(":" + port, handlers.CORS(headers, methods, origins)(router)))
}

Я успешно создалОбраз Docker, но у меня есть ошибка при создании контейнера Docker:

main.go:9:2: cannot find package "questionnaire/database" in any of:
        /usr/local/go/src/questionnaire/database (from $GOROOT)
        /go/src/questionnaire/database (from $GOPATH)
main.go:10:2: cannot find package "questionnaire/routes" in any of:
        /usr/local/go/src/questionnaire/routes (from $GOROOT)
        /go/src/questionnaire/routes (from $GOPATH)
main.go:11:2: cannot find package "questionnaire/utils" in any of:
        /usr/local/go/src/questionnaire/utils (from $GOROOT)
        /go/src/questionnaire/utils (from $GOPATH)

Кто-нибудь может сказать, как решить эту проблему?

Я также пытался собрать двоичный файл приложения golang в Docker следующим Dockerfile, носообщение об ошибке было то же RUN go build команда:

FROM golang:1.12

RUN go get github.com/gorilla/mux && \
  go get github.com/gorilla/handlers && \
  go get github.com/lib/pq && \
  go get github.com/joho/godotenv && \
  go get github.com/jinzhu/gorm && \
  go get gopkg.in/goracle.v2

ADD . /go/src/questionnaire

WORKDIR /go/src/questionnaire

RUN go build -o /bin questionnaire

ENV PORT=8000

CMD ["/bin"]

1 Ответ

2 голосов
/ 11 марта 2019

При импорте в ваш файл main.go укажите:

"questionnaire/database" "questionnaire/routes" "questionnaire/utils"

Это означает, что компилятор go ищет эти пакеты в $GOPATH/questionnaire и $GOROOT/questionnaire. Вы должны убедиться, что они скопированы в правильное место внутри образа докера, который вы создаете.

Значение по умолчанию $ GOPATH внутри этого golang:1.12 изображения /go. Убедитесь, что ваш пакет анкет правильно размещен в каталоге /go/src внутри образа докера.

Что касается Dockerfile: Обычной стратегией при создании / развертывании образов Docker для приложений go является использование шаблона компоновщика (см. Пример Dockerfile ниже). Суть его в том, чтобы создать многоэтапный Dockerfile, где на первом этапе создается исполняемый файл go, а на втором этапе запускается его. Это означает, что вы можете изолировать все свои зависимости на первом этапе и в итоге получить очень маленькое общее изображение в конце.

Это может выглядеть примерно так:

FROM golang:1.11-alpine AS builder

########
# Prep
########

# add the source
COPY . /go/src/questionnaire
WORKDIR /go/src/questionnaire/

########
# Build Go Wrapper
########

# Install go dependencies
RUN go get github.com/gorilla/mux && \
  go get github.com/gorilla/handlers && \
  go get github.com/lib/pq && \
  go get github.com/joho/godotenv && \
  go get github.com/jinzhu/gorm && \
  go get github.com/go-goracle/goracle

#build the go app
RUN GOOS=linux GOARCH=amd64 go build -o ./questionnaire ./main.go

########
# Package into runtime image
########
FROM alpine

# copy the executable from the builder image
COPY --from=builder /go/src/questionnaire .

ENTRYPOINT ["/questionnaire"]

EXPOSE 8080

Надеюсь, это поможет!

(отредактировано с учетом комментариев ниже)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...