build(docker): add docker image files for deployment

This commit is contained in:
MrTimscampi 2021-01-19 10:54:11 +01:00
parent aac95deda8
commit 0bfce8c8cf
8 changed files with 299 additions and 49 deletions

View File

@ -1,68 +1,68 @@
jobs:
- job: Build
displayName: 'Build'
displayName: "Build"
pool:
vmImage: 'ubuntu-latest'
vmImage: "ubuntu-latest"
steps:
- task: NodeTool@0
displayName: 'Install Node'
displayName: "Install Node"
inputs:
versionSpec: '12.x'
versionSpec: "14.x"
- task: Cache@2
displayName: 'Check Cache'
displayName: "Check Cache"
inputs:
key: 'yarn | yarn.lock'
path: 'node_modules'
key: "yarn | yarn.lock"
path: "node_modules"
cacheHitVar: CACHE_RESTORED
- script: 'yarn install --frozen-lockfile'
displayName: 'Install Dependencies'
- script: "yarn install --frozen-lockfile"
displayName: "Install Dependencies"
condition: ne(variables.CACHE_RESTORED, 'true')
- script: 'yarn build'
displayName: 'Build'
- script: "yarn build"
displayName: "Build"
- task: PublishPipelineArtifact@1
displayName: 'Publish Generated Static Pages as Artifact'
displayName: "Publish Generated Static Pages as Artifact"
inputs:
targetPath: $(System.DefaultWorkingDirectory)/dist
artifactName: dist
- job: BuildDocker
displayName: 'Build Docker Images'
- job: BuildSsrDocker
displayName: "Build Docker Images (SSR)"
dependsOn: Build
condition: succeeded()
pool:
vmImage: 'ubuntu-latest'
vmImage: "ubuntu-latest"
variables:
- name: DOCKER_CLI_EXPERIMENTAL
value: 'enabled'
value: "enabled"
- name: Version
value: $[replace(variables['Build.SourceBranch'],'refs/tags/v','')]
steps:
- task: DownloadPipelineArtifact@2
displayName: 'Download Artifact from Build Job'
displayName: "Download Artifact from Build Job"
inputs:
source: current
artifact: dist
path: $(System.DefaultWorkingDirectory)/dist
- task: Docker@2
displayName: 'Login to Docker Hub'
displayName: "Login to Docker Hub"
condition: or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
inputs:
command: login
containerRegistry: 'Docker Hub'
containerRegistry: "Docker Hub"
- task: CmdLine@2
displayName: 'Register Qemu Binfmt and Docker Buildx Builder'
displayName: "Register Qemu Binfmt and Docker Buildx Builder"
inputs:
script: |
docker version
@ -70,41 +70,119 @@ jobs:
docker buildx create --name builder --driver docker-container
- task: CmdLine@2
displayName: 'Build PR Docker Image'
displayName: "Build PR Docker Image"
condition: eq(variables['System.PullRequest.TargetBranch'], 'master')
inputs:
script: |
docker buildx use --builder builder
docker buildx build --file ./Dockerfile.dev --no-cache \
docker buildx build --file ./Dockerfile --no-cache \
--platform linux/arm,linux/arm64,linux/amd64 \
--tag pr-$(System.PullRequest.PullRequestId) .
--tag pr-$(System.PullRequest.PullRequestId)-ssr .
- task: CmdLine@2
displayName: 'Build and Push Unstable Docker Image'
displayName: "Build and Push Unstable Docker Image"
condition: eq(variables['Build.SourceBranch'], 'refs/heads/master')
inputs:
script: |
docker buildx use --builder builder
docker buildx build --file ./Dockerfile.dev --no-cache --push \
docker buildx build --file ./Dockerfile --no-cache --push \
--platform linux/arm,linux/arm64,linux/amd64 \
--tag jellyfin/jellyfin-vue:unstable-$(Build.BuildNumber) \
--tag jellyfin/jellyfin-vue:unstable-ssr-$(Build.BuildNumber) \
--tag jellyfin/jellyfin-vue:unstable-ssr \
--tag jellyfin/jellyfin-vue:unstable .
- task: CmdLine@2
displayName: 'Build and Push Stable Docker Image'
displayName: "Build and Push Stable Docker Image"
condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
inputs:
script: |
docker buildx use --builder builder
docker buildx build --file ./Dockerfile.dev --no-cache --push \
docker buildx build --file ./Dockerfile --no-cache --push \
--platform linux/arm,linux/arm64,linux/amd64 \
--tag jellyfin/jellyfin-vue:$(Version) \
--tag jellyfin/jellyfin-vue:stable \
--tag jellyfin/jellyfin-vue:$(Version)-ssr \
--tag jellyfin/jellyfin-vue:stable-ssr \
--tag jellyfin/jellyfin-vue:latest .
- task: Docker@2
displayName: 'Logout from Docker Hub'
displayName: "Logout from Docker Hub"
condition: or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
inputs:
command: logout
containerRegistry: 'Docker Hub'
containerRegistry: "Docker Hub"
- job: BuildDocker
displayName: "Build Docker Images"
dependsOn: Build
condition: succeeded()
pool:
vmImage: "ubuntu-latest"
variables:
- name: DOCKER_CLI_EXPERIMENTAL
value: "enabled"
- name: Version
value: $[replace(variables['Build.SourceBranch'],'refs/tags/v','')]
steps:
- task: DownloadPipelineArtifact@2
displayName: "Download Artifact from Build Job"
inputs:
source: current
artifact: dist
path: $(System.DefaultWorkingDirectory)/dist
- task: Docker@2
displayName: "Login to Docker Hub"
condition: or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
inputs:
command: login
containerRegistry: "Docker Hub"
- task: CmdLine@2
displayName: "Register Qemu Binfmt and Docker Buildx Builder"
inputs:
script: |
docker version
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker buildx create --name builder --driver docker-container
- task: CmdLine@2
displayName: "Build PR Docker Image"
condition: eq(variables['System.PullRequest.TargetBranch'], 'master')
inputs:
script: |
docker buildx use --builder builder
docker buildx build --file ./Dockerfile.static --no-cache \
--platform linux/arm,linux/arm64,linux/amd64 \
--tag pr-$(System.PullRequest.PullRequestId)-static .
- task: CmdLine@2
displayName: "Build and Push Unstable Docker Image"
condition: eq(variables['Build.SourceBranch'], 'refs/heads/master')
inputs:
script: |
docker buildx use --builder builder
docker buildx build --file ./Dockerfile.static --no-cache --push \
--platform linux/arm,linux/arm64,linux/amd64 \
--tag jellyfin/jellyfin-vue:unstable-static-$(Build.BuildNumber) \
--tag jellyfin/jellyfin-vue:unstable-static .
- task: CmdLine@2
displayName: "Build and Push Stable Docker Image"
condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
inputs:
script: |
docker buildx use --builder builder
docker buildx build --file ./Dockerfile.static --no-cache --push \
--platform linux/arm,linux/arm64,linux/amd64 \
--tag jellyfin/jellyfin-vue:$(Version)-static \
--tag jellyfin/jellyfin-vue:stable-static .
- task: Docker@2
displayName: "Logout from Docker Hub"
condition: or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
inputs:
command: logout
containerRegistry: "Docker Hub"

105
.docker/mime.types Normal file
View File

@ -0,0 +1,105 @@
types {
# Data interchange
application/atom+xml atom;
application/json json map topojson;
application/ld+json jsonld;
application/rss+xml rss;
# Normalize to standard type.
# https://tools.ietf.org/html/rfc7946#section-12
application/geo+json geojson;
application/xml xml;
# Normalize to standard type.
# https://tools.ietf.org/html/rfc3870#section-2
application/rdf+xml rdf;
# JavaScript
# Servers should use text/javascript for JavaScript resources.
# https://html.spec.whatwg.org/multipage/scripting.html#scriptingLanguages
text/javascript js mjs;
application/wasm wasm;
# Manifest files
application/manifest+json webmanifest;
application/x-web-app-manifest+json webapp;
text/cache-manifest appcache;
# Media files
audio/midi mid midi kar;
audio/mp4 aac f4a f4b m4a;
audio/mpeg mp3;
audio/ogg oga ogg opus;
audio/wav wav;
audi/webm weba;
audio/x-realaudio ra;
audio/x-matroska mka;
image/bmp bmp;
image/gif gif;
image/jpeg jpeg jpg;
image/jxr jxr hdp wdp;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-jng jng;
video/3gpp 3gp 3gpp;
video/mp2t ts;
video/mp4 f4p f4v m4v mp4;
video/mpeg mpeg mpg;
video/ogg ogv;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-mng mng;
video/x-ms-asf asf asx;
video/x-ms-wmv wmv;
video/x-msvideo avi;
video/x-matroska mkv mk3d;
# Serving `.ico` image files with a different media type
# prevents Internet Explorer from displaying then as images:
# https://github.com/h5bp/html5-boilerplate/commit/37b5fec090d00f38de64b591bcddcb205aadf8ee
image/x-icon cur ico;
# Subtitles
application/subrip sub;
text/plain txt ass ssa srt;
text/vtt vtt;
# Web fonts
font/woff woff;
font/woff2 woff2;
application/vnd.ms-fontobject eot;
font/ttf ttf;
font/collection ttc;
font/otf otf;
# Other
application/epub+zip epub;
application/gzip gz;
application/pdf pdf;
application/ttml+xml ttml;
application/x-7z-compressed 7z;
application/x-bzip bz;
application/x-bzip2 bz2:
application/x-mpegURL m3u m3u8;
application/x-rar-compressed rar;
application/zip zip;
text/css css;
text/html htm html shtml;
}

19
.docker/nginx.conf Normal file
View File

@ -0,0 +1,19 @@
server {
listen 80 default_server;
root /usr/share/nginx/html;
index index.html;
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied expired no-cache no-store private auth;
gzip_types application/javascript application/json application/geo+json application/ld+json application/manifest+json application/rdf+xml application/rss+xml application/ttml+xml application/xml application/x-mpegURL text/css text/javascript text/plain text/vtt text/xml;
gzip_disable "MSIE [1-6]\.";
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
}

8
.docker/nuxt.config.js Normal file
View File

@ -0,0 +1,8 @@
const config = {
server: {
port: process.env.PORT || 80,
host: process.env.HOST || "0.0.0.0",
},
};
export default config;

12
.docker/package.json Normal file
View File

@ -0,0 +1,12 @@
{
"name": "jellyfin-vue",
"author": "Jellyfin Team",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "nuxt-start"
},
"dependencies": {
"nuxt-start": "^2.14.12"
}
}

View File

@ -4,23 +4,30 @@ WORKDIR /app
RUN apk add --no-cache --virtual .build-deps git python make automake autoconf g++ libpng-dev libtool nasm file
ADD package.json yarn.lock ./
COPY package.json yarn.lock ./
RUN yarn install
RUN yarn install --frozen-lockfile
RUN apk del .build-deps
COPY . .
ADD . .
# Build SSR app for production in standalone mode
RUN yarn build:ssr
RUN yarn build:ssr --production --standalone
# Build final image
FROM node:14-alpine
WORKDIR /app
COPY .docker/package.json .docker/nuxt.config.js ./
# Copy client files from the build image
COPY --from=build /app/.nuxt ./.nuxt
COPY --from=build /app/static ./static
# Install runtime dependencies
RUN yarn install --production
# Expose the port
EXPOSE 80
# set app serving to permissive / assigned
ENV NUXT_HOST=0.0.0.0
# set app port
ENV NUXT_PORT=80
# start the client
CMD [ "yarn", "start:ssr" ]
CMD [ "yarn", "start" ]

View File

@ -1,4 +0,0 @@
FROM nginx:alpine
COPY dist/ /usr/share/nginx/html/
COPY .docker/nginx.conf /etc/nginx/conf.d/default.conf
COPY .docker/mime.types /etc/nginx/mime.types

25
Dockerfile.static Normal file
View File

@ -0,0 +1,25 @@
FROM node:14-alpine AS build
# Install build dependencies for node modules
RUN apk add git python make automake autoconf g++ libpng-dev libtool nasm file
# Set workdir
WORKDIR /app
# Copy package.json and yarn.lock
COPY package.json yarn.lock ./
# Install dependencies
RUN yarn install
# Copy resources
COPY . .
# Build static site
RUN yarn build
# Deploy built distribution to nginx
FROM nginx:alpine
COPY --from=build /app/dist/ /usr/share/nginx/html/
COPY .docker/nginx.conf /etc/nginx/conf.d/default.conf
COPY .docker/mime.types /etc/nginx/mime.types