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}