-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
54 lines (45 loc) · 3.87 KB
/
Dockerfile
File metadata and controls
54 lines (45 loc) · 3.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
FROM golang:1.25-alpine AS builder
#Установка необходимых пакетов внутри сырой версии golang
RUN apk add --no-cache git make
#Установить директорию в которую мы положим все файлы нашего проекта
WORKDIR /app
#Скопировать все зависимости
COPY go.mod go.sum ./
RUN go mod download
COPY . .
#Для production среды забилдим образ максимально легковесный
RUN CGO_ENABLED=0 GOOS=linux go build \
#Ниже представлен флаг линкера. В целом линкер это инструмент языка, который объединяет объектные файлы в один исполняемый.
#Чтобы облегчить и обезопасить сборку ДЛЯ PRODUCTION СРЕДЫ используются флаги:
# `-W` - позволяет убрать информацию о дебаге
# `-s` - отключает таблицу символов (symbol table). Эта структура, содержащая инфу о всех функциях, переменных и тд, которые использует программа
#Таблица символов позволяет делать удобную отладку, однако без неё я в отладчике буду видеть только адреса без названий переменных, функций и тд.
-ldflags "-w -s" \
#Ниже представлен полный путь, куда будет скопирован сервис:
-o /app/bin/orderservice \
#Это путь к исходному файлу, который нужно скопировать:
./cmd/main/main.go
#Теперь пропишем вторую фазу сборки докер-образа
FROM alpine:latest AS runtime
#ca-certificates — набор корневых сертификатов удостоверяющих центров (CA), которые нужны для проверки SSL/TLS-соединений.
#Без них многие HTTPS-запросы (curl, wget, пакеты Go и др.) не смогут проверить подлинность серверов, и соединения будут отвергаться.
#tzdata — база данных часовых поясов, обрабатываемая системой и приложениями, чтобы правильно работать с локальным временем в разных регионах.
#Особенно важна для корректного отображения временных меток и расписаний.
RUN apk --no-cache add ca-certificates tzdata shadow
#addgroup -g 1000 appuser
#Создаёт группу с именем appuser и ID группы (GID) 1000.
#adduser -D -u 1000 -G appuser appuser
#Создаёт пользователя с именем appuser, который будет:
#-D — создан с настройками по умолчанию (не будет домашнего каталога по умолчанию)
#-u 1000 — с UID (идентификатором пользователя) равным 1000
#-G appuser — добавлен в группу appuser
RUN addgroup -g 1000 appuser && adduser -D -u 1000 -G appuser appuser
WORKDIR /app
COPY --from=builder /app/bin/orderservice /app/orderservice
#рекурсивно меняем пользователя для файлов и папок внутри /app на appuser
RUN chown -R appuser:appuser /app
#После этой строки все последующие команды и процессы в контейнере будут запущены от имени пользователя appuser, а не от root.
USER appuser
FROM runtime AS orderservice
EXPOSE 50052
ENTRYPOINT [ "/app/orderservice" ]