ai-course/Dockerfile-api

126 lines
4.5 KiB
Plaintext
Raw Permalink Normal View History

2025-11-18 13:32:46 +08:00
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17 AS api-builder
COPY ./app/api /app/playedu
WORKDIR /app/playedu
RUN sed -i 's/\r$//' mvnw
RUN chmod +x mvnw
RUN /app/playedu/mvnw -T 1C -DarchetypeCatalog=local -Dmaven.test.skip=true -Dmaven.repo.remote=https://maven.aliyun.com/repository/public package
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/node:20-alpine AS node-builder
COPY app/backend /app/backend
COPY app/pc /app/pc
COPY app/h5 /app/h5
WORKDIR /app/backend
RUN pnpm i && VITE_APP_URL=/api/ pnpm build
WORKDIR /app/pc
RUN pnpm i && VITE_APP_URL=/api/ pnpm build
WORKDIR /app/h5
RUN pnpm i && VITE_APP_URL=/api/ pnpm build
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17 AS config-builder
# 是否启用MINIO
ARG ENABLED_MINIO=false
# 是否启用SSL
ARG ENABLED_SSL=false
# SSL是否是通配符证书
ARG SSL_WILDCARD=false
# API域名
ARG DOMAIN_API
ARG DOMAIN_PC
ARG DOMAIN_H5
ARG DOMAIN_ADMIN
ARG DOMAIN_MINIO
RUN if [ "$ENABLED_SSL" = "true" ] && [ -z "$DOMAIN_API" ]; then \
echo "请配置API域名"; \
exit 1; \
fi
RUN if [ "$ENABLED_SSL" = "true" ] && [ -z "$DOMAIN_PC" ]; then \
echo "请配置PC域名"; \
exit 1; \
fi
RUN if [ "$ENABLED_SSL" = "true" ] && [ -z "$DOMAIN_H5" ]; then \
echo "请配置H5域名"; \
exit 1; \
fi
RUN if [ "$ENABLED_SSL" = "true" ] && [ -z "$DOMAIN_ADMIN" ]; then \
echo "请配置后台管理域名"; \
exit 1; \
fi
RUN if [ "$ENABLED_MINIO" = "true" ] && [ "$ENABLED_SSL" = "true" ] && [ -z "$DOMAIN_MINIO" ]; then \
echo "请配置MINIO域名"; \
exit 1; \
fi
COPY docker/nginx/conf/nginx.conf /docker/nginx/conf/nginx.conf
COPY docker/nginx/conf/nginx.ssl.conf /docker/nginx/conf/nginx.ssl.conf
RUN sed -i 's/\r$//' /docker/nginx/conf/nginx.conf
RUN sed -i 's/\r$//' /docker/nginx/conf/nginx.ssl.conf
RUN if [ "$ENABLED_MINIO" != "true" ]; then \
sed -i "/####MINIO-START####/,/####MINIO-END####/d" /docker/nginx/conf/nginx.ssl.conf; \
sed -i "/####MINIO-START####/,/####MINIO-END####/d" /docker/nginx/conf/nginx.conf; \
fi
RUN if [ -n "$DOMAIN_API" ]; then \
sed -i "s/api.domain/${DOMAIN_API}/g" /docker/nginx/conf/nginx.ssl.conf; \
fi
RUN if [ -n "$DOMAIN_PC" ]; then \
sed -i "s/pc.domain/${DOMAIN_PC}/g" /docker/nginx/conf/nginx.ssl.conf; \
fi
RUN if [ -n "$DOMAIN_H5" ]; then \
sed -i "s/h5.domain/${DOMAIN_H5}/g" /docker/nginx/conf/nginx.ssl.conf; \
fi
RUN if [ -n "$DOMAIN_ADMIN" ]; then \
sed -i "s/admin.domain/${DOMAIN_ADMIN}/g" /docker/nginx/conf/nginx.ssl.conf; \
fi
RUN if [ "$ENABLED_MINIO" = "true" ] && [ -n "$DOMAIN_MINIO" ]; then \
sed -i "s/minio.domain/${DOMAIN_MINIO}/g" /docker/nginx/conf/nginx.ssl.conf; \
fi
RUN if [ "$ENABLED_SSL" = "true" ] && [ "$SSL_WILDCARD" = "true" ]; then \
sed -i 's/pc.pem\|h5.pem\|api.pem\|admin.pem\|minio.pem/playedu.pem/g' /docker/nginx/conf/nginx.ssl.conf; \
sed -i 's/pc.key\|h5.key\|api.key\|admin.key\|minio.key/playedu.key/g' /docker/nginx/conf/nginx.ssl.conf; \
fi
# 由构建参数决定是否启动ssl的nginx配置
RUN if [ "$ENABLED_SSL" = "true" ]; then \
cp /docker/nginx/conf/nginx.ssl.conf /etc/nginx/sites-enabled/default; \
else \
cp /docker/nginx/conf/nginx.conf /etc/nginx/sites-enabled/default; \
fi
FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17
COPY --from=api-builder /app/playedu/playedu-api/target/playedu-api-*.jar /app/api/app.jar
COPY --from=node-builder /app/backend/dist /app/backend
COPY --from=node-builder /app/pc/dist /app/frontend
COPY --from=node-builder /app/h5/dist /app/h5
COPY --from=config-builder /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/default
WORKDIR /app/api
EXPOSE 80/tcp
EXPOSE 443/tcp
EXPOSE 9800/tcp
EXPOSE 9801/tcp
EXPOSE 9900/tcp
EXPOSE 9002/tcp
CMD echo "Waiting for MySQL/Redis/MinIO to start..."; sleep 15 ;nginx;java -jar /app/api/app.jar --spring.datasource.url="jdbc:mysql://${DB_HOST}:${DB_PORT:-3306}/${DB_NAME}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true" --spring.datasource.username=${DB_USER} --spring.datasource.password=${DB_PASS} --spring.data.redis.host=${REDIS_HOST} --spring.data.redis.port=${REDIS_PORT:-6379} --spring.data.redis.password=${REDIS_PASS} --spring.data.redis.database=${REDIS_DB:-0} --sa-token.is-concurrent=${SA_TOKEN_IS_CONCURRENT:-false} --apiUrl.loginUrl=https://${SERVER_API_HOST}/api/v1/auth/login/loginInSoftWare --sa-token.jwt-secret-key=${SA_TOKEN_JWT_SECRET_KEY} --spring.kafka.bootstrap-servers=${KAFKA_BOOTSTRAP_SERVERS}