Created
July 26, 2024 12:54
-
-
Save zwilias/e0321634b0a90ab085e4d64da00147d3 to your computer and use it in GitHub Desktop.
Backstage Dockerfile for yarn 3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This dockerfile builds an image for the backend package. | |
# It should be executed with the root of the repo as docker context. | |
# | |
# Before building this image, be sure to have run the following commands in the repo root: | |
# | |
# yarn install | |
# yarn tsc | |
# yarn build:backend | |
# | |
# Once the commands have been run, you can build the image using `yarn build-image` | |
FROM node:18-bookworm-slim | |
# Install isolate-vm dependencies, these are needed by the @backstage/plugin-scaffolder-backend. | |
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ | |
--mount=type=cache,target=/var/lib/apt,sharing=locked \ | |
apt-get update && \ | |
apt-get install -y --no-install-recommends python3 g++ build-essential | |
# Install sqlite3 dependencies. You can skip this if you don't use sqlite3 in the image, | |
# in which case you should also move better-sqlite3 to "devDependencies" in package.json. | |
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ | |
--mount=type=cache,target=/var/lib/apt,sharing=locked \ | |
apt-get update && \ | |
apt-get install -y --no-install-recommends libsqlite3-dev | |
# From here on we use the least-privileged `node` user to run the backend. | |
USER node | |
# This should create the app dir as `node`. | |
# If it is instead created as `root` then the `tar` command below will fail: `can't create directory 'packages/': Permission denied`. | |
# If this occurs, then ensure BuildKit is enabled (`DOCKER_BUILDKIT=1`) so the app dir is correctly created as `node`. | |
WORKDIR /app | |
# This switches many Node.js dependencies to production mode. | |
ENV NODE_ENV production | |
# Use python3 by default | |
ENV PYTHON /usr/bin/python3 | |
# Copy repo skeleton first, to avoid unnecessary docker cache invalidation. | |
# The skeleton contains the package.json of each package in the monorepo, | |
# and along with yarn.lock and the root package.json, that's enough to run yarn install. | |
COPY --chown=node:node .yarnrc.yml yarn.lock package.json packages/backend/dist/skeleton.tar.gz ./ | |
COPY --chown=node:node .yarn ./.yarn | |
RUN tar xzf skeleton.tar.gz && rm skeleton.tar.gz | |
RUN --mount=type=cache,target=/home/node/.cache/yarn,sharing=locked,uid=1000,gid=1000 \ | |
yarn workspaces focus --all --production && rm -rf "$(yarn cache clean)" | |
# Then copy the rest of the backend bundle, along with any other files we might want. | |
COPY --chown=node:node packages/backend/dist/bundle.tar.gz app-config*.yaml ./ | |
RUN tar xzf bundle.tar.gz && rm bundle.tar.gz | |
CMD ["node", "packages/backend", "--config", "app-config.yaml", "--config", "app-config.production.yaml"] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment