Dockerfile 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. ARG REGISTRY=docker.io
  2. FROM ${REGISTRY}/golang:1.24-alpine AS builder
  3. RUN set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
  4. # 定义应用路径参数,用于指定构建的入口文件路径
  5. ARG APP_RELATIVE_PATH
  6. # 定义应用名称参数,用于指定输出的二进制文件名
  7. ARG APP_NAME=app
  8. COPY .. /data/app
  9. WORKDIR /data/app
  10. RUN mkdir -p /data/app/bin/
  11. RUN export GOPROXY=https://goproxy.cn,direct && go mod tidy && go build -ldflags="-s -w" -o ./bin/${APP_NAME} ${APP_RELATIVE_PATH}
  12. RUN mv config /data/app/bin/
  13. FROM ${REGISTRY}/alpine:3.16
  14. RUN set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
  15. RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  16. && echo "Asia/Shanghai" > /etc/timezone \
  17. && apk del tzdata
  18. ARG APP_ENV
  19. ENV APP_ENV=${APP_ENV}
  20. # 传递应用名称到运行环境
  21. ARG APP_NAME=app
  22. ENV APP_NAME=${APP_NAME}
  23. WORKDIR /data/app
  24. COPY --from=builder /data/app/bin /data/app
  25. # 仅对server应用暴露端口
  26. EXPOSE 8000
  27. # 在构建阶段设置ENTRYPOINT
  28. RUN echo '#!/bin/sh' > /data/app/entrypoint.sh && \
  29. echo './'${APP_NAME} >> /data/app/entrypoint.sh && \
  30. chmod +x /data/app/entrypoint.sh
  31. ENTRYPOINT [ "./entrypoint.sh" ]
  32. # 构建server应用示例
  33. #docker build -t 1.1.1.1:5000/demo-api:v1 --build-arg APP_NAME=app --build-arg APP_RELATIVE_PATH=./cmd/server/main.go .
  34. # 构建task应用示例
  35. #docker build -t 1.1.1.1:5000/demo-task:v1 --build-arg APP_NAME=task --build-arg APP_RELATIVE_PATH=./cmd/task/main.go .
  36. # 运行容器测试示例
  37. #docker run -it --rm --entrypoint=ash 1.1.1.1:5000/demo-api:v1