|
1 | | -# Use official Node.js image as the base image for building Vue.js app |
2 | | -FROM node:18 as build-stage |
| 1 | +# ======================== |
| 2 | +# Build Stage (Vue + Env) |
| 3 | +# ======================== |
| 4 | +FROM node:18 AS build-stage |
3 | 5 |
|
4 | | -# Set working directory |
5 | 6 | WORKDIR /app |
6 | 7 |
|
7 | | -# Copy package.json and package-lock.json |
8 | | -COPY client/package*.json ./ |
| 8 | +# Build-time args |
| 9 | +ARG VITE_APP_API_ROOT |
| 10 | +ARG VITE_APP_OAUTH_API_ROOT |
| 11 | +ARG VITE_APP_OAUTH_CLIENT_ID |
| 12 | +ARG VITE_APP_LOGIN_REDIRECT |
| 13 | +ARG SUBPATH |
9 | 14 |
|
10 | | -# Install dependencies |
| 15 | +# Copy and install dependencies |
| 16 | +COPY client/package*.json ./ |
11 | 17 | RUN npm install |
12 | 18 |
|
13 | | -# Copy the rest of the application |
| 19 | +# Copy full client code |
14 | 20 | COPY client . |
15 | 21 |
|
16 | | -# Build the Vue.js application |
| 22 | +# Log and write .env.production |
| 23 | +RUN echo "SUBPATH=${SUBPATH}" && \ |
| 24 | + echo "VITE_APP_API_ROOT=${VITE_APP_API_ROOT}" >> .env.production && \ |
| 25 | + echo "VITE_APP_OAUTH_API_ROOT=${VITE_APP_OAUTH_API_ROOT}" >> .env.production && \ |
| 26 | + echo "VITE_APP_OAUTH_CLIENT_ID=${VITE_APP_OAUTH_CLIENT_ID}" >> .env.production && \ |
| 27 | + echo "VITE_APP_LOGIN_REDIRECT=${VITE_APP_LOGIN_REDIRECT}" >> .env.production && \ |
| 28 | + echo "VITE_APP_SUBPATH=${SUBPATH}" >> .env.production |
| 29 | + |
| 30 | +# Set environment for build |
| 31 | +ENV VITE_APP_API_ROOT=${VITE_APP_API_ROOT} |
| 32 | +ENV VITE_APP_OAUTH_API_ROOT=${VITE_APP_OAUTH_API_ROOT} |
| 33 | +ENV VITE_APP_OAUTH_CLIENT_ID=${VITE_APP_OAUTH_CLIENT_ID} |
| 34 | +ENV VITE_APP_LOGIN_REDIRECT=${VITE_APP_LOGIN_REDIRECT} |
| 35 | +ENV SUBPATH=${SUBPATH} |
| 36 | +ENV VITE_APP_SUBPATH=${SUBPATH} |
| 37 | + |
| 38 | +# Run Vue build |
17 | 39 | RUN npm run build |
18 | 40 |
|
19 | | -# Use NGINX as the final base image |
20 | | -FROM nginx:alpine |
| 41 | +# ======================== |
| 42 | +# Nginx Stage |
| 43 | +# ======================== |
| 44 | +FROM nginx:alpine AS production-stage |
21 | 45 |
|
22 | | -# Remove default NGINX website |
| 46 | +# Build-time ARG to get SUBPATH |
| 47 | +ARG SUBPATH |
| 48 | + |
| 49 | +# Clean default site |
23 | 50 | RUN rm -rf /usr/share/nginx/html/* |
24 | 51 |
|
25 | | -# Copy built Vue.js app to NGINX HTML directory |
26 | | -COPY --from=build-stage /app/dist /usr/share/nginx/html |
| 52 | +# Copy build output |
| 53 | +COPY --from=build-stage /app/dist /tmp/dist |
27 | 54 |
|
28 | | -RUN ls |
29 | | -# Copy custom NGINX configuration |
30 | | -COPY nginx/nginx.conf /etc/nginx/nginx.conf |
31 | 55 |
|
32 | | -# Expose port 80 |
33 | | -EXPOSE 80 |
| 56 | +# If SUBPATH is set, copy dist to subfolder and rewrite nginx config |
| 57 | +COPY nginx/nginx.subpath.template /nginx.subpath.template |
| 58 | +COPY nginx/nginx.conf /nginx.conf |
34 | 59 |
|
35 | | -# Start NGINX |
| 60 | +# hadolint ignore=SC2016 |
| 61 | +RUN if [ -n "$SUBPATH" ]; then \ |
| 62 | + echo "Copying Vue build to /usr/share/nginx/html/${SUBPATH}"; \ |
| 63 | + mkdir -p /usr/share/nginx/html/${SUBPATH}; \ |
| 64 | + cp -r /tmp/dist/* /usr/share/nginx/html/${SUBPATH}/; \ |
| 65 | + envsubst '${SUBPATH}' < /nginx.subpath.template > /etc/nginx/nginx.conf; \ |
| 66 | + else \ |
| 67 | + echo "No SUBPATH set. Using default nginx.conf"; \ |
| 68 | + cp /nginx.conf /etc/nginx/nginx.conf; \ |
| 69 | + cp -r /tmp/dist/* /usr/share/nginx/html/; \ |
| 70 | + fi |
| 71 | + |
| 72 | +EXPOSE 80 |
36 | 73 | CMD ["nginx", "-g", "daemon off;"] |
0 commit comments