И еще один:
reduce(lambda x, y:x or getattr(obj, y, None), "a b c".split(), None)
(в Python 3 вам нужно импортировать сокращение из functools. Он встроен в Python 2)
Импорт в вашем файле 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
Надеюсь, это поможет!
(отредактировано, чтобы отразить комментарии ниже)