我試著使用multiple stage的方式建立一個小型的image
docker file如下:
FROM golang AS build
WORKDIR /app
COPY . .
RUN cd ./src && go build -o ../bin/app
RUN rm -r src/ .vscode/ .git/
FROM alpine AS release
COPY --from=build /app /app
WORKDIR /app/bin
ENTRYPOINT ["./app"]
當使用docker run時,會回覆我說file不存在,但我實際連進去container(用-it),確定執行檔確實存在,但即便是在container內部啟動程式,它也一樣跟我說不存在
有試過另外載bash來執行,但狀況一樣
但如果不是用alpine,而是用比較肥的golang image是可以執行成功,但golang:alpine這個一樣不行
使用 golang:alpine
去 build,再複製到 alpine
FROM golang:alpine AS build
WORKDIR /app
COPY . .
RUN cd ./src && go build -o ../bin/app
RUN rm -r src/ .vscode/ .git/
FROM alpine AS release
COPY --from=build /app /app
WORKDIR /app/bin
ENTRYPOINT ["./app"]
alpine 跟你說不存在,其實只是該檔案無法執行,可能的原因是 alpine 沒有需要的 *.so
檔,所以先在 alpine 環境 (golang:alpine
) 編譯再移到 alpine 就沒問題啦~
alpine tag
主要是執行用的
裡面通常沒有 build 所需的環境
所以先用 golang image 先build
再丟給 golang:alpine 執行
這樣做的好處是 container 會比較精簡