Docker кеширует слои по порядку: если изменился один слой, все последующие пересобираются. Нужно копировать то, что меняется реже (зависимости), раньше, а код приложения - позже.
COPY . /app
RUN go mod download
RUN go build -o app .
# Любое изменение в коде сбрасывает кеш и заново go mod download + build
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o app .
# Изменение кода пересобирает только COPY . и RUN go build; зависимости берутся из кеша
Так go mod download выполняется заново только при изменении go.mod или go.sum. Сборка после правки кода занимает секунды.