add dockerfile with multistage
This commit is contained in:
@ -7,7 +7,7 @@
|
|||||||
"build" : {
|
"build" : {
|
||||||
"dockerfile": "Dockerfile",
|
"dockerfile": "Dockerfile",
|
||||||
"options": [
|
"options": [
|
||||||
"-t=godev"
|
"-t=godev:latest"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/app,type=bind,consistency=cached",
|
"workspaceMount": "source=${localWorkspaceFolder},target=/home/vscode/app,type=bind,consistency=cached",
|
||||||
|
|||||||
29
Dockerfile
Normal file
29
Dockerfile
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
FROM golang:tip-alpine3.22 AS builder
|
||||||
|
COPY . /app
|
||||||
|
WORKDIR /app
|
||||||
|
RUN apk update --no-cache && apk add --no-cache \
|
||||||
|
&& apk add --no-cache make
|
||||||
|
|
||||||
|
RUN make build
|
||||||
|
|
||||||
|
FROM alpine:3.22.3 AS prod
|
||||||
|
|
||||||
|
ARG PROJECT_NAME=learn
|
||||||
|
ARG APP_USER=${PROJECT_NAME}_user
|
||||||
|
ARG APP_UID=10001
|
||||||
|
ARG APP_GID=10001
|
||||||
|
|
||||||
|
|
||||||
|
RUN addgroup -g ${APP_GID} ${APP_USER} && \
|
||||||
|
adduser -u ${APP_UID} \
|
||||||
|
-G ${APP_USER} \
|
||||||
|
-S \
|
||||||
|
-H \
|
||||||
|
-D ${APP_USER}
|
||||||
|
|
||||||
|
COPY --from=builder /app/bin /srv/${PROJECT_NAME}
|
||||||
|
RUN chown -R ${APP_USER}:${APP_USER} /srv/
|
||||||
|
USER ${APP_USER}
|
||||||
|
WORKDIR /srv/${PROJECT_NAME}
|
||||||
|
|
||||||
|
CMD ["./learn"]
|
||||||
41
Makefile
Normal file
41
Makefile
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# Переменные
|
||||||
|
# Имя бинарника (измените на ваше)
|
||||||
|
BINARY_NAME := learn
|
||||||
|
# Выходной каталог
|
||||||
|
BUILD_DIR := bin
|
||||||
|
# Директория с конфигами (например, config.yaml)
|
||||||
|
CONFIG_DIR := config
|
||||||
|
# Все Go-файлы
|
||||||
|
GO_SRC := $(shell find . -name '*.go')
|
||||||
|
GO_MOD := go.mod go.sum
|
||||||
|
VERSION := $(shell git describe --tags --always)
|
||||||
|
# Цель по умолчанию: сборка
|
||||||
|
all: build
|
||||||
|
|
||||||
|
# Сборка бинарника и копирование файлов
|
||||||
|
build: $(BUILD_DIR)/$(BINARY_NAME)
|
||||||
|
@echo "Build completed"
|
||||||
|
|
||||||
|
$(BUILD_DIR)/$(BINARY_NAME): $(GO_SRC) $(GO_MOD)
|
||||||
|
@mkdir -p $(BUILD_DIR)
|
||||||
|
# Измените ./cmd/myapp на путь к main.go
|
||||||
|
CGO_ENABLED=0 GOARCH=amd64 go build -o $(BUILD_DIR)/$(BINARY_NAME) ./cmd/app/main.go
|
||||||
|
# Копируем конфиги (добавьте другие файлы по аналогии, e.g. cp static/* $(BUILD_DIR)/)
|
||||||
|
@mkdir $(BUILD_DIR)/$(CONFIG_DIR)/
|
||||||
|
@cp -r $(CONFIG_DIR)/*.yml $(BUILD_DIR)/$(CONFIG_DIR)/
|
||||||
|
|
||||||
|
# Тестирование
|
||||||
|
test:
|
||||||
|
go test -v ./...
|
||||||
|
|
||||||
|
# Очистка
|
||||||
|
clean:
|
||||||
|
rm -rf $(BUILD_DIR)
|
||||||
|
go clean
|
||||||
|
|
||||||
|
# Docker-сборка (пример, если нужно собрать образ)
|
||||||
|
docker-build: build
|
||||||
|
docker build -t $(BINARY_NAME):latest -f Dockerfile .
|
||||||
|
docker build -t $(BINARY_NAME):$(VERSION) -f Dockerfile .
|
||||||
|
|
||||||
|
.PHONY: all build test clean docker-build
|
||||||
1
bin/config/config.yml
Normal file
1
bin/config/config.yml
Normal file
@ -0,0 +1 @@
|
|||||||
|
API_KEY: some_secret_api_key_sss
|
||||||
@ -1,9 +1,20 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
fmt.Println("Hello world")
|
viper.AddConfigPath("config")
|
||||||
|
err := viper.ReadInConfig()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Error loading file: %v", err.Error())
|
||||||
|
}
|
||||||
|
api_key := viper.GetString("API_KEY")
|
||||||
|
fmt.Println("Hello world, and API_KEY:", api_key)
|
||||||
c := fmt.Sprintf("Test text: %s", "formatted")
|
c := fmt.Sprintf("Test text: %s", "formatted")
|
||||||
fmt.Printf("Some text: %s", c)
|
fmt.Printf("Some text: %s", c)
|
||||||
}
|
}
|
||||||
|
|||||||
1
config/config.yml
Normal file
1
config/config.yml
Normal file
@ -0,0 +1 @@
|
|||||||
|
API_KEY: some_secret_api_key_sss
|
||||||
16
go.mod
16
go.mod
@ -1,3 +1,19 @@
|
|||||||
module learn
|
module learn
|
||||||
|
|
||||||
go 1.25.4
|
go 1.25.4
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||||
|
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
|
||||||
|
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
||||||
|
github.com/sagikazarmark/locafero v0.11.0 // indirect
|
||||||
|
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect
|
||||||
|
github.com/spf13/afero v1.15.0 // indirect
|
||||||
|
github.com/spf13/cast v1.10.0 // indirect
|
||||||
|
github.com/spf13/pflag v1.0.10 // indirect
|
||||||
|
github.com/spf13/viper v1.21.0 // indirect
|
||||||
|
github.com/subosito/gotenv v1.6.0 // indirect
|
||||||
|
go.yaml.in/yaml/v3 v3.0.4 // indirect
|
||||||
|
golang.org/x/sys v0.29.0 // indirect
|
||||||
|
golang.org/x/text v0.28.0 // indirect
|
||||||
|
)
|
||||||
|
|||||||
27
go.sum
Normal file
27
go.sum
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||||
|
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||||
|
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
|
||||||
|
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
|
||||||
|
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
|
||||||
|
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
|
||||||
|
github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc=
|
||||||
|
github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik=
|
||||||
|
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw=
|
||||||
|
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U=
|
||||||
|
github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
|
||||||
|
github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
|
||||||
|
github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
|
||||||
|
github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
|
||||||
|
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
|
||||||
|
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
|
github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=
|
||||||
|
github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=
|
||||||
|
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
|
||||||
|
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
|
||||||
|
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
|
||||||
|
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
|
||||||
|
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
|
||||||
|
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
|
||||||
|
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
Reference in New Issue
Block a user