summaryrefslogblamecommitdiffstats
path: root/Dockerfile
blob: 24eb5a108a626156310d0dafe6104b6f00572ae8 (plain) (tree)
1
2
3
4
5
6
7
8
9
                                            
 



                                      


             































































































































































                                                                                                                      

     






















                                                                  

     









                                                                                 

      
























                                                               

      

               

     






                         
 
                       

      






































































                                                                                              





                                                                                                                                   
# SPDX-License-Identifier: AGPL-3.0-or-later

FROM alpine AS stage-alpine

# alpine - Official Image | Docker Hub
# https://hub.docker.com/_/alpine

WORKDIR /app/

# Install all dependencies, including Wget, Rust, Docusaurus, and other required packages.

RUN \
apk \
-- \
add \
wget \
gcc \
rustup \
npm \
;

# Install the dependencies of Docusaurus and Typescript.

COPY \
./docusaurus/package.json \
./docusaurus/package.json

RUN \
npm \
--prefix ./docusaurus/ \
-- \
install \
;

RUN \
npm \
--prefix ./docusaurus/ \
-- \
audit \
fix \
;

COPY \
./typescript/package.json \
./typescript/package.json

RUN \
npm \
--prefix ./typescript/ \
-- \
install \
;

RUN \
npm \
--prefix ./typescript/ \
-- \
audit \
fix \
;

# Set up the Rust compiler.

RUN \
rustup-init \
-y \
-- \
;

# Download the necessary dependencies for the Rust programs.

COPY \
./rust/wolfree_download_dependencies/ \
./rust/wolfree_download_dependencies/

RUN \
PATH="$HOME/.cargo/bin:$PATH" \
cargo \
-- \
clippy \
--manifest-path ./rust/wolfree_download_dependencies/Cargo.toml \ 
-- \
--warn clippy::all \
--warn clippy::cargo \
--warn clippy::nursery \
--warn clippy::pedantic \
--warn clippy::restriction \
;

RUN \
PATH="$HOME/.cargo/bin:$PATH" \
cargo \
run \
--manifest-path ./rust/wolfree_download_dependencies/Cargo.toml \
-- \
;

# Cloudflare and WolframAlpha are invaluable tools for web developers,
# providing easy access to prebuilt JavaScript files.
# To effortlessly obtain these files, you can utilize the Wget command-line utility.
# Cloudflare's web servers offer a vast collection of popular JavaScript libraries.
# On the other hand,
# WolframAlpha's web servers specifically host the essential JavaScript files for the 2-dimensional math input editor.

RUN \
wget \
--directory-prefix=./docusaurus/static/ \
--no-host-directories \
--page-requisites \
--convert-links \
--no-verbose \
--input-file=- \
--base= \
-- \
'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js' \
'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.map' \
'https://cdnjs.cloudflare.com/ajax/libs/dompurify/3.0.5/purify.min.js' \
'https://cdnjs.cloudflare.com/ajax/libs/dompurify/3.0.5/purify.min.js.map' \
'https://www.wolframalpha.com/input/index.html' \
; \
: \
;

# We use the Sed command to extract the pathnames from the "Webpack" and "buildManifest" files.
# After successfully parsing the pathnames, we proceed to download the files using the Wget command.

RUN \
sed \
-e 's|.*js...static.chunks...........||' \
-e 's|"........js.....miniCssF.*|.js\n|' \
-e 's|:"|.|g' \
-e 's|",|.js\n|g' \
-- \
./docusaurus/static/_next/static/chunks/webpack-*.js \
| \
wget \
--directory-prefix=./docusaurus/static/ \
--no-host-directories \
--page-requisites \
--convert-links \
--no-verbose \
--input-file=- \
--base=https://www.wolframalpha.com/_next/static/chunks/ \
-- \
; \
: \
;

RUN \
sed \
-e 's|.*return.static.css.....||' \
-e 's|.........css.......function.*|.css\n|' \
-e 's|[0-9]*:"||g' \
-e 's|",|.css\n|g' \
-- \
./docusaurus/static/_next/static/chunks/webpack-*.js \
| \
wget \
--directory-prefix=./docusaurus/static/ \
--no-host-directories \
--page-requisites \
--convert-links \
--no-verbose \
--input-file=- \
--base=https://www.wolframalpha.com/_next/static/css/ \
-- \
; \
: \
;

RUN \
sed \
-e 's|.*sortedPages.*}..||' \
-e 's|...self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB.*||' \
-e 's|","|\n|g' \
-- \
./docusaurus/static/_next/static/*/_buildManifest.js \
| \
wget \
--directory-prefix=./docusaurus/static/ \
--no-host-directories \
--page-requisites \
--convert-links \
--no-verbose \
--input-file=- \
--base=https://www.wolframalpha.com/_next/ \
-- \
; \
: \
;

# Remove unused large files,
# such as decorative images,
# from the static website.

RUN \
truncate \
-s 0 \
-- \
./docusaurus/static/_next/static/images/* \
./docusaurus/static/_next/static/media/*.png \
./docusaurus/static/_next/static/media/*.gif \
;

# Compile and execute the Rust program.
# The Rust program allows customization of the static pages downloaded with Wget.

COPY \
./rust/wolfree_sed_in_place/ \
./rust/wolfree_sed_in_place/

RUN \
PATH="$HOME/.cargo/bin:$PATH" \
cargo \
-- \
clippy \
--manifest-path ./rust/wolfree_sed_in_place/Cargo.toml \
-- \
--warn clippy::all \
--warn clippy::cargo \
--warn clippy::nursery \
--warn clippy::pedantic \
--warn clippy::restriction \
;

RUN \
PATH="$HOME/.cargo/bin:$PATH" \
cargo run \
--manifest-path ./rust/wolfree_sed_in_place/Cargo.toml \
-- \
;

# Compile the Typescript files and output the JavaScript files.

COPY \
./typescript/ \
./typescript/

RUN \
npm \
--prefix ./typescript/ \
-- \
exec \
tsc \
--project ./typescript/ \
;

# Preprocess MDX files.

COPY \
./docusaurus/ \
./docusaurus/

# Run the Rust program to customize the Docusaurus pages.

COPY \
./rust/wolfree_patch_libredirect/ \
./rust/wolfree_patch_libredirect/

RUN \
PATH="$HOME/.cargo/bin:$PATH" \
cargo \
-- \
clippy \
--manifest-path ./rust/wolfree_patch_libredirect/Cargo.toml \
-- \
--warn clippy::all \
--warn clippy::cargo \
--warn clippy::nursery \
--warn clippy::pedantic \
--warn clippy::restriction \
;

RUN \
PATH="$HOME/.cargo/bin:$PATH" \
cargo run \
--manifest-path ./rust/wolfree_patch_libredirect/Cargo.toml \
-- \
;

# Create a webpage that lists all repositories and instructions for self-hosting web services.

COPY \
./README.md \
./README.md

RUN \
cat \
-- \
./README.md \
>> \
./docusaurus/docs/source.mdx \
;

# Use Docusaurus to build the static website.

RUN \
npm \
--prefix ./docusaurus/ \
-- \
run \
build \
;

# Host the static content with a webserver.

CMD \
npm \
--prefix ./docusaurus/ \
-- \
run \
serve \
--host localhost \
--port 80 \
;

EXPOSE 80

# TODO: multi-stage
# https://docs.docker.com/build/building/multi-stage/
# https://docs.docker.com/build/guide/multi-stage/

# Optimizing builds with cache management | Docker Documentation
# https://docs.docker.com/build/cache/
# Because a change causes a rebuild for steps that follow,
# try to make expensive steps appear near the beginning of the Dockerfile.
# Steps that change often should appear near the end of the Dockerfile to avoid triggering rebuilds of layers that haven't changed.