diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8633aec --- /dev/null +++ b/Dockerfile @@ -0,0 +1,70 @@ +FROM node:lts-bookworm-slim + +# The base name of the npm package +ARG LINKSPECTOR_NAME=@umbrelladocs/linkspector +# Use the argument below to select version to install, e.g.: +# docker build --build-arg LINKSPECTOR_VERSION=0.2.7 -t linkspector . +ARG LINKSPECTOR_VERSION=latest +# Use the argument below the specify full package name to install, +# empty value installs current directory, e.g.: +# docker build --build-arg LINKSPECTOR_PACKAGE= -t linkspector . +ARG LINKSPECTOR_PACKAGE=${LINKSPECTOR_NAME}@${LINKSPECTOR_VERSION} + +# Set default user +ENV USER=node + +# Set installation location for node packages +ENV NPM_GLOBAL=/home/${USER}/.npm-global +ENV PATH=${NPM_GLOBAL}/bin:$PATH + +# Install chromium instead of puppeteer chrome +# as puppeteer does not provide arm64 +# https://github.com/puppeteer/puppeteer/issues/7740 +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true +ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium.wrapper + +# Install linkspector dependencies +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + bash \ + ca-certificates \ + chromium \ + curl \ + git \ + upower \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +# Create app directory for mounting host files +RUN mkdir /app && chown ${USER}:${USER} /app + +# chromium in order to start either needs dbus https://github.com/puppeteer/puppeteer/issues/11028 +# or skip dbus by using --remote-debugging-port=0 (any free port) https://github.com/nodejs/help/issues/3220#issuecomment-1228342313 +# Additionally, allow chromium to start without elevated capabilities needed to start the sandbox +# See https://github.com/puppeteer/puppeteer/issues/5505 +RUN echo /usr/bin/chromium \ + --no-sandbox \ + --headless=new \ + --disable-gpu \ + --enable-chrome-browser-cloud-management \ + --remote-debugging-port=0 \ + > /usr/bin/chromium.wrapper +RUN chmod ugo+x /usr/bin/chromium.wrapper + +# Install linkspector as node user +USER ${USER} +WORKDIR /home/${USER} +RUN npm config set prefix /home/${USER}/.npm-global +COPY --chown=${USER}:${USER} lib lib +COPY --chown=${USER}:${USER} bun.lockb index.js linkspector.js package.json . +RUN if test -z ${LINKSPECTOR_PACKAGE}; then npm install; fi && npm install --global ${LINKSPECTOR_PACKAGE} + +# Hoist (link to top level node_modules) linkspector's node_modules (dependencies like puppeteer) +RUN cd ${NPM_GLOBAL}/lib/node_modules && ls -al ${LINKSPECTOR_NAME} +RUN cd ${NPM_GLOBAL}/lib/node_modules && find ${LINKSPECTOR_NAME}/node_modules/* -type d -maxdepth 0 +RUN cd ${NPM_GLOBAL}/lib/node_modules && find ${LINKSPECTOR_NAME}/node_modules/* -type d -maxdepth 0 | xargs -I {} ln -sv {} . +WORKDIR /app + +# Run sanity checks +RUN npm list --global +RUN linkspector --version +RUN linkspector check diff --git a/README.md b/README.md index 6e52b2b..12e6075 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,27 @@ To check hyperlinks in your markup language files, follow these steps: linkspector check -c /path/to/custom-config.yml ``` +1. When using docker, mount the directory that contains files to be checked. For example: + + To build the docker image locally, while being at the root (`.`) of this project: + ```bash + docker build --no-cache --pull -t umbrelladocs/linkspector . + ``` + + To perform a check using the default configuration, while being at the root (`$PWD`) of the project to be checked: + ```bash + docker run --rm -it -v $PWD:/app \ + --name linkspector umbrelladocs/linkspector \ + bash -c 'linkspector check' + ``` + + To specify a custom configuration file path: + ```bash + docker run --rm -it -v $PWD:/app -v $PWD/custom-config.yml:/path/to/custom-config.yml \ + --name linkspector umbrelladocs/linkspector \ + bash -c 'linkspector check -c /path/to/custom-config.yml' + ``` + 1. Linkspector starts checking the hyperlinks in your files based on the configuration provided in the configuration file or using the default configuration. It then displays the results in your terminal. 1. After the check is complete, Linkspector provides a summary of the results. If any dead links are found, they are listed in the terminal, along with their status codes and error messages.