@SSSSTTTTAAAASSSS

Не получается создать Docker image через docker-compose c кодом на GO?

Всем добрый день!

Не пойму в чем причина, но у меня почему-то не получается забилдеть через docker-compose контейнер со совими сервисами.
Если запускать по отдельности, а только postgresql в docker-e - все ок, все работает, как и задумывалось. Пытаюсь сделать чтобы можно было запускать одной командой и почему-то при создании контейнера, пишет в моих сервисах на GO что пакет не находится в GOROOT.
В go env GO GO111MODULE=on
Вот моя структура проекта:
modules
    ├───front-end
    │   ├───cmd
    │   │   └───front-end/main.go
    │   └───pkg
    │   |   ├───app
    │   |   │   ├───config
    │   |   │   └───router
    │   |   ├───handler
    │   |   │   └───event
    │   |   └───templates
    |   |
    |   └─── front-end.Dockerfile
    |   └───go.mod
    |
    └───backend
        ├───cmd
        │   └───backend/main.go
        ├───handler
        │   └───product
        ├───model
        ├───pkg
        └───app
        |     ├───config
        |     ├───router
        |     ├───storage
        |     │   └───postgresql
        |     └───worker
        |
        └───backend.Dockerfile
        └───go.mod
 docker-compose.yaml

Мой docker-compose.yaml:
version: "3.1"

services:
  front-end:
    container_name: "frontend"
    build:
      context: "."
      dockerfile: "./modules/front-end/front-end.Dockerfile"
    ports:
      - "8080:8080"
    environment:
      PORT: ":8080"
      PROJECT_ID: "359008"
      TOPIC_ID: "topic"

  backend:
    container_name: "backend"
    build:
      context: "."
      dockerfile: "./modules/backend/backend.Dockerfile"
    ports:
      - "8081:8081"
    environment:
      PORT: ":8081"
      PROJECT_ID: "359008"
      TOPIC_ID: "topic"
      HOST_DB: "postgres"
      PORT_DB: "5432"
      USER_DB: "user"
      PSW_DB: "qwerty"
      NAME_DB: "user"
      SSLDB: "disable"

  postgres:
    container_name: "postgres"
    image: postgres:latest
    restart: always
    user: "user"
    environment:
      POSTGRES_USER: "user"
      POSTGRES_PASSWORD: "qwerty"
      POSTGRES_DATABASE: "user"
    ports:
      - "5432:5432"

Мой dockerFile одного из сервиса, второй аналогичный, только путь к go.mod в другую папку:
FROM golang:1.19

WORKDIR /backend

# Copy and download dependency using go mod
COPY ./modules/backend/go.mod .
COPY ./modules/backend/go.sum .
RUN go mod download

# Copy the code into the container
COPY . .

ENTRYPOINT ["go", "run", "./modules/backend/cmd/backend/main.go"]


Вопрос наверное выглядит очень глупым, но уже все идеи кончились, туториалы посмотрел, но пока результата не дало.
Буду благодарен за любую помощь в моем вопросе, или направлении где искать ошибку.

П.С.: все файлы не описывал по папкам, т.к. они роли в моей проблеме не играют, но если надо переделаю всю структуру и добавлю все файлы, хотя уверен что проблема кроется в dockerfiles.

UPD:
Пофиксил проблему в dockerfiles.
Вот так выглядит рабочий dockerfile :
FROM golang:1.19

WORKDIR /backend

# Copy and download dependency using go mod
COPY ./modules/backend/go.mod .
COPY ./modules/backend/go.sum .
RUN go mod download

# Copy the code into the container
COPY ./modules/backend ./

ENTRYPOINT ["go", "run", "./cmd/backend/main.go"]
  • Вопрос задан
  • 210 просмотров
Решения вопроса 1
@SSSSTTTTAAAASSSS Автор вопроса
Благодаря помощи Micro Null таки получилось переделать Dockerfile -ы для того чтобы сделать multi-stage build, который будет занимать мало места.
Возможно кому-то поможет исправленные Dockerfile:
FROM golang:1.19 as builder

WORKDIR /backend

COPY ./modules/backend/go.mod .
COPY ./modules/backend/go.sum .
RUN go mod download

COPY ./modules/backend ./

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -o ./backend ./cmd/backend

FROM alpine:3.15
RUN apk update
WORKDIR /

COPY --from=builder /backend .

ENTRYPOINT ["./backend"]


Второй dockerFile аналогичный, только вместо "backend" - "front-end"
Всем удачи!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@micronull
Вы пытаетесь запустить через `go run`.
Эта команда компилирует приложение во временную директорию и от туда его запускает.
В итоге контейнер после успешной компиляции завершает своё выполнение и ни как не реагирует на запуск временного файла.

Вы можете через multi-stage builds предварительно скомпилировать приложение и переместить полученный файл в новый image.
И уже там прописывать ENTRYPOINT на полученный бинарный файл.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы