Dockerfile 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. # 先复制依赖文件,利用缓存层
  9. WORKDIR /data/app
  10. COPY go.mod go.sum /data/app/
  11. RUN export GOPROXY=https://goproxy.cn,direct && go mod download
  12. # 再复制其他文件
  13. COPY . /data/app/
  14. RUN mkdir -p /data/app/bin/
  15. RUN export GOPROXY=https://goproxy.cn,direct && go mod tidy && go build -ldflags="-s -w" -o ./bin/${APP_NAME} ${APP_RELATIVE_PATH}
  16. RUN mv config /data/app/bin/
  17. FROM ${REGISTRY}/alpine:3.16
  18. RUN set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
  19. RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  20. && echo "Asia/Shanghai" > /etc/timezone \
  21. && apk del tzdata
  22. ARG APP_ENV
  23. ENV APP_ENV=${APP_ENV}
  24. # 传递应用名称到运行环境
  25. ARG APP_NAME=app
  26. ENV APP_NAME=${APP_NAME}
  27. WORKDIR /data/app
  28. COPY --from=builder /data/app/bin /data/app
  29. # 仅对server应用暴露端口
  30. EXPOSE 8000
  31. # 在构建阶段设置ENTRYPOINT,支持通过APP_CONF环境变量指定配置文件
  32. RUN echo '#!/bin/sh' > /data/app/entrypoint.sh && \
  33. echo 'if [ ! -z "$APP_CONF" ]; then' >> /data/app/entrypoint.sh && \
  34. echo ' echo "Using config from APP_CONF: $APP_CONF"' >> /data/app/entrypoint.sh && \
  35. echo 'fi' >> /data/app/entrypoint.sh && \
  36. echo 'exec ./'${APP_NAME}' "$@"' >> /data/app/entrypoint.sh && \
  37. chmod +x /data/app/entrypoint.sh
  38. ENTRYPOINT [ "./entrypoint.sh" ]
  39. # 构建server应用示例
  40. #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 .
  41. # 构建task应用示例
  42. #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 .
  43. # 运行容器测试示例
  44. #docker run -it --rm --entrypoint=ash 1.1.1.1:5000/demo-api:v1