Home >Backend Development >Golang >go install takes a lot of time in dockerfile

go install takes a lot of time in dockerfile

王林
王林forward
2024-02-06 09:50:041167browse

go install 在 dockerfile 中需要花费很多时间

Question content

I use go-jet to generate the model from the database, so I need to do it in go build Before running jet. I need to install it via go install otherwise docker cannot find the jet executable. I encountered a problem: When I rebuild my application, docker re-downloads go-jet every time (takes 60-80 seconds).

Is there a better way to generate (or cache the jet library)? Installation takes too long

I tried caching jet in the Dockerfile, but it re-downloaded again:

RUN --mount=type=cache,target=/go/pkg/mod/ \
    go install github.com/go-jet/jet/v2/cmd/jet@latest

My Dockerfile:

FROM golang:latest

WORKDIR /app

COPY go.mod .
COPY go.sum .

RUN go mod download

COPY . .

RUN go install github.com/go-jet/jet/v2/cmd/jet@latest

CMD sh deployments/startup.sh

My startup.sh:

jet -dsn="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}?sslmode=disable" -schema=public -path=.gen
cd cmd/app
go build
./app

And my docker-compose, just in case:

version: '3.9'

x-common-variables: &database-credentials
  POSTGRES_DB: ${POSTGRES_DB}
  POSTGRES_USER: ${POSTGRES_USER}
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
  POSTGRES_HOST: ${POSTGRES_HOST}
  POSTGRES_PORT: ${POSTGRES_PORT}

services:
  cache:
    image: redis:latest
    restart: always
    ports:
      - "6379:6379"
    command: redis-server
    environment:
      - REDIS_PORT=6379

  database:
    image: postgres:latest
    container_name: db
    environment:
      <<: *database-credentials
    ports:
      - "5433:5432"
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -U postgres" ]
      interval: 5s
      timeout: 5s
      retries: 10

  migrate:
    image: migrate/migrate
    volumes:
      - ../internal/app/storage/postgres/migrations:/migrations
    command: -path /migrations -database "postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:${POSTGRES_PORT}/${POSTGRES_DB}?sslmode=disable" up
    depends_on:
      database:
        condition: service_healthy

  webapi:
    image: webapi
    build: ../
    ports:
      - "8080:8080"
    depends_on:
      - migrate
    environment:
      <<: *database-credentials

Correct Answer


Found a very simple solution. I need to put go install before COPY. .. What happens: When docker detects changes in the project, it deletes the application cache (line COPY . . ) and all following lines (including go install).

My final Dockerfile:

...

RUN go install github.com/go-jet/jet/v2/cmd/jet@latest

COPY . .

...

The above is the detailed content of go install takes a lot of time in dockerfile. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete