- vừa được xem lúc

Cách nhúng private go module vào trong một dự án golang và đóng gói bằng docker

0 0 12

Người đăng: Nguyen Tran Nhat Duc

Theo Viblo Asia

Source code ở đây

Với bất kỳ lập trình viên golang đều biết đến và đã làm quen go module public. Nhưng ít ai trong chúng ta biết đến và sử dụng private go module. Hôm nay mình sẽ chia sẻ lại ví dụ mẫu để import private go module vào trong dự án và đóng gói docker

1. Tự tạo một go module cho riêng bạn như khi làm go module public

Việc đầu tiên tạo một go module và đẩy lên github repo private.

Ví dụ khi đẩy lên github repo có cấu trúc như sau

├──model/
| ├──blog.go
├──main.go
├──go.mod

Trong model/blog.go:

package model type Post struct { Title string Content string
}

Trong main.go:

package private_gomod import "<module tại đây>/model" func GetPost() model.Post { return model.Post{ Title: "Tạo thử một private go module", Content:"Tạo thử thành công", }
}

Trong go.mod:

module <git repo ở đây> go 1.16

Khi tạo xong giờ ta cần release phiên bản cho nó. Để làm vậy tại github repository ta chọn Create a New Realease. Sẽ ra màn hình sau đây:

w

Ở đây mình nhập tag version v0.0.0 và title là "release lần đầu". Sau đấy publish release.

Vậy là bạn đã có một go module cho riêng mình.

Có thể tham khảo thêm cách release github repo tại đây

2. Mang go module vào dự án

Bước đầu tiên ta cd vào thư mục dự án và sử dụng go get <tên go module của bạn>. Nhưng hiển thị lỗi 410 Gone. Đó là bởi vì module của chúng ta đang là private. Để xử lý ta làm các bước sau:

2.1 Set GOPRIVATE

Tùy theo bạn muốn cài đặt private ở cấp độ nào. Giả sử toàn bộ dự án trên máy của bạn chỉ cần duy nhất một private go module thì bạn có thể đặt private là github.com/<github username hoặc tổ chức của bạn>/<tên project module của bạn>. Tức chỉ có duy nhất module này được mang vào dự án.

Nếu bạn sử dụng nhiều private go module thì có thể Set Private ở cấp độ tài khoản cá nhân hoặc tổ chức của bạn: github.com/<github username hoặc tổ chức của bạn>. Tức bất cứ private module trong tài khoản github hoặc tổ chức của bạn đều có thể sử dụng mang vào dự án

Ví dụ một tài khoản cá nhân là japangermany và bạn muốn sử dụng toàn bộ private module trong tài khoản này. Ta có thể Set GOPRIVATE bằng câu lệnh đơn giản:

go env -w GOPRIVATE=github.com/japangermany

Tương tự nếu muốn sử dụng toàn bộ private module trong tổ chức, ví dụ ở đây là techmaster.

go env -w GOPRIVATE=github.com/techmaster

Chỉ cho duy nhất một private module:

go env -w GOPRIVATE=github.com/japangermany/private_module

2.2 Truyền credentials cho GoModule.

Cũng như đăng nhập oauth2 cần có client_id, để sử dụng private GoModule bạn cần có token xác thực. Ở chế độ develop thì đã có câu lệnh git để làm việc đó.

Đầu tiên ta có thể tạo ra personal access token github ở đây

Sau khi tạo xong đã có token, giờ bạn có thể dựng câu lệnh git sau:

git config --global url."https://${username}:${access_token}@github.com".insteadOf /
"https://github.com"

Truyền username và access token tương ứng. Như vậy bạn đã có thể thực hiện go get private module và mang được vào trong dự án.

3. Đóng gói docker

Ở trên ta mới mang private module vào được ở chế độ development, giờ nếu muốn đóng gói docker thế nào. Dưới đây là cách viết dockerfile đóng gói của mình:

# Start from the latest golang base image
FROM golang:latest AS build WORKDIR /app # SET tên biến, sử dụng khi gõ câu lệnh docker build image
ARG GITHUB_USER=$GITHUB_USER
ARG GITHUB_TOKEN=$GITHUB_TOKEN COPY go.mod .
COPY go.sum . # Đăng nhập thông tin github để cấp quyền khi go mod download private module. Đây là bước quan trọng
RUN echo "machine github.com login $GITHUB_USER password $GITHUB_TOKEN" > ~/.netrc RUN go mod download COPY . . # Câu lệnh để build và chạy được trên alpine
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -o HelloGo . # Nếu không muốn chạy trên alpine có thể bỏ qua các bước này và đi thẳng đến EXPOSE cổng
FROM alpine:latest WORKDIR /app COPY . .
COPY --from=build /app/HelloGo . EXPOSE 8080 ENTRYPOINT ["./HelloGo"]

Sau đó chạy:

docker build --build-arg GITHUB_USER=<tên github username> --build-arg GITHUB_TOKEN=<token của bạn> -t <tên image> .

Vậy là bạn đã đóng gói được image thành công. Ta chỉ việc sử dụng câu lệnh docker run để chạy container và có một ứng dụng trên máy.

Bình luận

Bài viết tương tự

- vừa được xem lúc

gRPC - Nó là gì và có nên sử dụng hay không?

Nhân một ngày rảnh rỗi, mình ngồi đọc lại RPC cũng như gRPC viết lại để nhớ lâu hơn. Vấn đề là gì và tại sao cần nó .

0 0 132

- vừa được xem lúc

Embedded Template in Go

Getting Start. Part of developing a web application usually revolves around working with HTML as user interface.

0 0 57

- vừa được xem lúc

Tạo Resful API đơn giản với Echo framework và MySQL

1. Giới thiệu.

0 0 61

- vừa được xem lúc

Sử dụng goquery trong golang để crawler thông tin các website Việt Nam bị deface trên mirror-h.org

. Trong bài viết này, mình sẽ cùng mọi người khám phá một package thu thập dữ liệu có tên là goquery của golang. Mục tiêu chính của chương trình crawler này sẽ là lấy thông tin các website Việt Nam bị deface (là tấn công, phá hoại website, làm thay đổi giao diện hiển thị của một trang web, khi người

0 0 237

- vừa được xem lúc

Tạo ứng dụng craw dữ liệu bing với Golang, Mysql driver

Chào mọi người . Lâu lâu ta lại gặp nhau 1 lần, để tiếp tục series chia sẻ kiến thức về tech, hôm nay mình sẽ tìm hiểu và chia sẻ về 1 ngôn ngữ đang khá hot trong cộng đồng IT đó là Golang.

0 0 76

- vừa được xem lúc

Golang: Rest api and routing using MUX

Routing with MUX. Let's create a simple CRUD api for a blog site. # All . GET articles/ .

0 0 55