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

go install takes a lot of time in dockerfile

王林
Release: 2024-02-06 09:50:04
forward
1165 people have browsed it

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
Copy after login

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
Copy after login

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
Copy after login

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
Copy after login


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 . .

...
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template