Hi! 最近在寫一些 Golang 的專案。在使用 Docker build image 時,發現了一些問題。
問題點
Docker image build 完後,執行 docker run
時出現以下錯誤
standard_init_linux.go:211: exec user process caused "no such file or directory"
原因
以我目前在寫的專案 URL-Shortener 為例。
在這個專案中,我用到了 go-sqlite3 這個 Library。
我們可以注意到 go-sqlite3 是以 C programming 來寫的。當我們在 build 時,需要使用到 GCC 及 CGO 來構建。所以我們也需要將 CGO_ENABLED 的變量設為 1,使其可以進行動態編譯。
- 執行指令就像這樣
$ CGO_ENABLED=1 CC=gcc go build -o /app/app main.go
Mini Image
開兩個 Container
第一個 Container
- 執行
docker build
進行 build。 - 將 build 完成的 binary file 複製到第二個 Container。
在第二個 Container 中安裝相關套件,打包。
FROM golang:1.18-alpine3.15 as builder
RUN apk --update upgrade \
&& apk add --no-cache sqlite gcc g++ \
&& rm -rf /var/cache/apk/*
WORKDIR /app
COPY . .
RUN CGO_ENABLED=1 CC=gcc go build -o /app/app main.go
FROM alpine:3.10
# Install for go-sqlite3 use
RUN apk --update upgrade \
&& apk add --no-cache sqlite \
&& rm -rf /var/cache/apk/*
COPY --from=builder /app/app /app/
WORKDIR /app
CMD ["./app"]