mirror of
https://github.com/penpot/penpot.git
synced 2026-10-28 21:40:34 +00:00
Bump the pnpm pin to 12.14.0 in the devenv and the production images and stamp the same version into every package.json, realigning the drift between the devenv (12.9.1) and the rest (12.6.0). Bump Node to v24.22.0, the newest patch of the Krypton LTS line, in .nvmrc, the devenv and image Dockerfiles and the plugins-deploy workflows. The pnpm arch checksums are those of the GitHub release tarballs, not of the npm package. Lockfile changes are metadata only. AI-assisted-by: deepseek-v4.1-flash
582 lines
19 KiB
Docker
582 lines
19 KiB
Docker
FROM dhi.io/debian-base:trixie-debian13-dev AS base
|
|
|
|
ENV LANG='C.UTF-8' \
|
|
LC_ALL='C.UTF-8' \
|
|
DEBIAN_FRONTEND=noninteractive
|
|
|
|
RUN set -ex; \
|
|
apt-get -qq update; \
|
|
apt-get -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade; \
|
|
apt-get -qqy --no-install-recommends install \
|
|
python3 \
|
|
unzip \
|
|
rsync \
|
|
wget \
|
|
sudo \
|
|
libpam-modules \
|
|
libpam-runtime \
|
|
tmux \
|
|
vim \
|
|
curl \
|
|
bash \
|
|
git \
|
|
ripgrep \
|
|
\
|
|
curl \
|
|
ca-certificates \
|
|
\
|
|
binutils \
|
|
build-essential autoconf libtool pkg-config \
|
|
; \
|
|
mkdir -p /usr/lib/pam.d; \
|
|
printf '%s\n' \
|
|
'#%PAM-1.0' \
|
|
'auth required pam_unix.so nullok' \
|
|
'account required pam_unix.so' \
|
|
'password required pam_unix.so' \
|
|
'session required pam_unix.so' \
|
|
'session required pam_limits.so' \
|
|
| tee /etc/pam.d/sudo /usr/lib/pam.d/sudo > /dev/null; \
|
|
printf '%s\n' \
|
|
'#%PAM-1.0' \
|
|
'auth required pam_deny.so' \
|
|
'account required pam_deny.so' \
|
|
'password required pam_deny.so' \
|
|
'session required pam_deny.so' \
|
|
| tee /etc/pam.d/other /usr/lib/pam.d/other > /dev/null; \
|
|
if [ ! -s /etc/nsswitch.conf ]; then \
|
|
printf '%s\n' \
|
|
'passwd: files' \
|
|
'group: files' \
|
|
'shadow: files' \
|
|
'gshadow: files' \
|
|
'hosts: files dns' \
|
|
'networks: files' \
|
|
'protocols: files' \
|
|
'services: files' \
|
|
'ethers: files' \
|
|
'rpc: files' \
|
|
'netgroup: files' \
|
|
> /etc/nsswitch.conf; \
|
|
fi
|
|
|
|
################################################################################
|
|
## NODE SETUP
|
|
################################################################################
|
|
|
|
FROM base AS setup-node
|
|
|
|
ENV NODE_VERSION=v24.22.0 \
|
|
PNPM_VERSION=12.14.0 \
|
|
PATH=/opt/node/bin:$PATH
|
|
|
|
RUN set -eux; \
|
|
ARCH="$(dpkg --print-architecture)"; \
|
|
case "${ARCH}" in \
|
|
aarch64|arm64) \
|
|
OPENSSL_ARCH='linux-aarch64'; \
|
|
BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-arm64.tar.gz"; \
|
|
PNPM_ARCH='arm64'; \
|
|
PNPM_SHA256='cfc780b9e690549e6633e1045fb1fb6ef84e390711e2099e6ccbae91c32456ea'; \
|
|
;; \
|
|
amd64|x86_64) \
|
|
OPENSSL_ARCH='linux-x86_64'; \
|
|
BINARY_URL="https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.gz"; \
|
|
PNPM_ARCH='x64'; \
|
|
PNPM_SHA256='3910c3852136bed5bc1511b9137a45fd4357ed6b3970d9d08893641e9005867e'; \
|
|
;; \
|
|
*) \
|
|
echo "Unsupported arch: ${ARCH}"; \
|
|
exit 1; \
|
|
;; \
|
|
esac; \
|
|
curl -LfsSo /tmp/nodejs.tar.gz ${BINARY_URL}; \
|
|
mkdir -p /opt/node; \
|
|
cd /opt/node; \
|
|
tar -xf /tmp/nodejs.tar.gz --strip-components=1; \
|
|
PNPM_URL="https://github.com/pnpm/pnpm/releases/download/v${PNPM_VERSION}/pnpm-linux-${PNPM_ARCH}.tar.gz"; \
|
|
curl -LfsSo /tmp/pnpm.tar.gz "${PNPM_URL}"; \
|
|
echo "${PNPM_SHA256} */tmp/pnpm.tar.gz" | sha256sum -c -; \
|
|
tar -xzf /tmp/pnpm.tar.gz -C /opt/node/bin pnpm; \
|
|
chmod 755 /opt/node/bin/pnpm; \
|
|
chown -R root /opt/node; \
|
|
find /opt/node/include/node/openssl/archs -mindepth 1 -maxdepth 1 ! -name "$OPENSSL_ARCH" -exec rm -rf {} \; ; \
|
|
rm -f /tmp/nodejs.tar.gz /tmp/pnpm.tar.gz;
|
|
|
|
################################################################################
|
|
## OPENCODE SETUP
|
|
################################################################################
|
|
|
|
# FROM base AS setup-opencode
|
|
|
|
# ENV OPENCODE_VERSION=2.0.29
|
|
|
|
# RUN set -eux; \
|
|
# ARCH="$(dpkg --print-architecture)"; \
|
|
# case "${ARCH}" in \
|
|
# aarch64|arm64) \
|
|
# BINARY_URL="https://registry.npmjs.org/@opencode/cli-linux-arm64/-/cli-linux-arm64-${OPENCODE_VERSION}.tgz"; \
|
|
# ESUM='0af39e75dbdfacc20f8f531ef35fb4dcc0b44c08084203518614272f232283ae'; \
|
|
# ;; \
|
|
# amd64|x86_64) \
|
|
# BINARY_URL="https://registry.npmjs.org/@opencode/cli-linux-x64/-/cli-linux-x64-${OPENCODE_VERSION}.tgz"; \
|
|
# ESUM='14b5a6638a1a093ac9d484599c844b10c29b445d04844b682ccc668ce26530a2'; \
|
|
# ;; \
|
|
# *) \
|
|
# echo "Unsupported arch: ${ARCH}"; exit 1; \
|
|
# ;; \
|
|
# esac; \
|
|
# curl -LfsSo /tmp/opencode.tgz "${BINARY_URL}"; \
|
|
# echo "${ESUM} */tmp/opencode.tgz" | sha256sum -c -; \
|
|
# mkdir -p /tmp/opencode; \
|
|
# tar -xzf /tmp/opencode.tgz -C /tmp/opencode --strip-components=2 package/bin; \
|
|
# chmod +x /tmp/opencode/opencode; \
|
|
# rm -f /tmp/opencode.tgz;
|
|
|
|
|
|
################################################################################
|
|
## CADDYSERVER SETUP
|
|
################################################################################
|
|
|
|
FROM base AS setup-caddy
|
|
|
|
ENV CADDY_VERSION=2.11.7
|
|
|
|
RUN set -eux; \
|
|
ARCH="$(dpkg --print-architecture)"; \
|
|
case "${ARCH}" in \
|
|
aarch64|arm64) \
|
|
BINARY_URL="https://github.com/caddyserver/caddy/releases/download/v${CADDY_VERSION}/caddy_${CADDY_VERSION}_linux_arm64.tar.gz"; \
|
|
;; \
|
|
amd64|x86_64) \
|
|
BINARY_URL="https://github.com/caddyserver/caddy/releases/download/v${CADDY_VERSION}/caddy_${CADDY_VERSION}_linux_amd64.tar.gz"; \
|
|
;; \
|
|
*) \
|
|
echo "Unsupported arch: ${ARCH}"; \
|
|
exit 1; \
|
|
;; \
|
|
esac; \
|
|
curl -LfsSo /tmp/caddy.tar.gz ${BINARY_URL}; \
|
|
mkdir -p /tmp/caddy; \
|
|
cd /tmp/caddy; \
|
|
tar -xf /tmp/caddy.tar.gz; \
|
|
chown -R root /tmp/caddy; \
|
|
mv /tmp/caddy/caddy /usr/bin/; \
|
|
rm -rf /tmp/caddy.tar.gz; \
|
|
rm -rf /tmp/caddy;
|
|
|
|
################################################################################
|
|
## JVM SETUP
|
|
################################################################################
|
|
|
|
FROM base AS setup-jvm
|
|
|
|
# https://clojure.org/releases/tools
|
|
ENV CLOJURE_VERSION=1.12.5.1664
|
|
|
|
RUN set -eux; \
|
|
ARCH="$(dpkg --print-architecture)"; \
|
|
case "${ARCH}" in \
|
|
aarch64|arm64) \
|
|
ESUM='9fa5bf865783c43840101fcdc3a5222b60daf4fe11f26806247bf807c08aba38'; \
|
|
BINARY_URL='https://cdn.azul.com/zulu/bin/zulu27.28.101-ca-jdk27.0.0-linux_aarch64.tar.gz'; \
|
|
;; \
|
|
amd64|x86_64) \
|
|
ESUM='ccbc15c4edbedfdcc03c2d29a2aa2c6daf9e6ffb4cda7dd5ece0fcbb37350267'; \
|
|
BINARY_URL='https://cdn.azul.com/zulu/bin/zulu27.28.101-ca-jdk27.0.0-linux_x64.tar.gz'; \
|
|
;; \
|
|
*) \
|
|
echo "Unsupported arch: ${ARCH}"; \
|
|
exit 1; \
|
|
;; \
|
|
esac; \
|
|
curl -LfsSo /tmp/openjdk.tar.gz ${BINARY_URL}; \
|
|
echo "${ESUM} */tmp/openjdk.tar.gz" | sha256sum -c -; \
|
|
mkdir -p /opt/jdk; \
|
|
cd /opt/jdk; \
|
|
tar -xf /tmp/openjdk.tar.gz --strip-components=1; \
|
|
rm -rf /tmp/openjdk.tar.gz;
|
|
|
|
RUN set -ex; \
|
|
curl -LfsSo /tmp/clojure.sh https://download.clojure.org/install/linux-install-$CLOJURE_VERSION.sh; \
|
|
chmod +x /tmp/clojure.sh; \
|
|
mkdir -p /opt/clojure; \
|
|
/tmp/clojure.sh --prefix /opt/clojure; \
|
|
rm -rf /tmp/clojure.sh;
|
|
|
|
################################################################################
|
|
## RUST SETUP
|
|
################################################################################
|
|
|
|
FROM base AS setup-rust
|
|
|
|
# Install Rust toolchain
|
|
ENV PATH=/opt/cargo/bin:$PATH \
|
|
RUSTUP_HOME=/opt/rustup \
|
|
CARGO_HOME=/opt/cargo \
|
|
RUSTUP_VERSION=1.28.2 \
|
|
RUST_VERSION=1.91.0 \
|
|
EMSCRIPTEN_VERSION=4.0.6
|
|
|
|
WORKDIR /opt
|
|
|
|
RUN set -eux; \
|
|
# Same steps as in Rust official Docker image https://github.com/rust-lang/docker-rust/blob/9f287282d513a84cb7c7f38f197838f15d37b6a9/1.81.0/bookworm/Dockerfile
|
|
arch="$(dpkg --print-architecture)"; \
|
|
case "$arch" in \
|
|
'amd64') \
|
|
rustArch='x86_64-unknown-linux-gnu'; \
|
|
rustupSha256='20a06e644b0d9bd2fbdbfd52d42540bdde820ea7df86e92e533c073da0cdd43c'; \
|
|
;; \
|
|
'arm64') \
|
|
rustArch='aarch64-unknown-linux-gnu'; \
|
|
rustupSha256='e3853c5a252fca15252d07cb23a1bdd9377a8c6f3efa01531109281ae47f841c'; \
|
|
;; \
|
|
*) echo >&2 "unsupported architecture: ${dpkgArch}"; exit 1 ;; \
|
|
esac; \
|
|
wget "https://static.rust-lang.org/rustup/archive/${RUSTUP_VERSION}/${rustArch}/rustup-init"; \
|
|
echo "${rustupSha256} *rustup-init" | sha256sum -c -; \
|
|
chmod +x rustup-init; \
|
|
./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION --default-host ${rustArch}; \
|
|
rm rustup-init; \
|
|
rustup component add rustfmt; \
|
|
rustup component add clippy; \
|
|
git clone https://github.com/emscripten-core/emsdk.git; \
|
|
cd emsdk; \
|
|
./emsdk install $EMSCRIPTEN_VERSION; \
|
|
./emsdk activate $EMSCRIPTEN_VERSION; \
|
|
rustup target add wasm32-unknown-emscripten; \
|
|
cargo install cargo-watch;
|
|
|
|
################################################################################
|
|
## UTILS SETUP
|
|
################################################################################
|
|
|
|
FROM base AS setup-utils
|
|
|
|
ENV CLJKONDO_VERSION=2026.08.04 \
|
|
BABASHKA_VERSION=1.13.225 \
|
|
CLJFMT_VERSION=0.16.6 \
|
|
PIXI_VERSION=0.81.0 \
|
|
GITHUB_CLI_VERSION=2.102.0 \
|
|
AWS_CLI_VERSION=2.37.9 \
|
|
UV_VERSION=0.12.23 \
|
|
UV_TOOL_DIR=/opt/uv/tools \
|
|
UV_TOOL_BIN_DIR=/opt/utils/bin \
|
|
UV_PYTHON_INSTALL_DIR=/opt/uv/python \
|
|
SERENA_VERSION=1.7.0
|
|
|
|
RUN set -ex; \
|
|
ARCH="$(dpkg --print-architecture)"; \
|
|
case "${ARCH}" in \
|
|
aarch64|arm64) \
|
|
BINARY_URL="https://github.com/clj-kondo/clj-kondo/releases/download/v$CLJKONDO_VERSION/clj-kondo-$CLJKONDO_VERSION-linux-aarch64.zip"; \
|
|
;; \
|
|
amd64|x86_64) \
|
|
BINARY_URL="https://github.com/clj-kondo/clj-kondo/releases/download/v$CLJKONDO_VERSION/clj-kondo-$CLJKONDO_VERSION-linux-amd64.zip"; \
|
|
;; \
|
|
*) \
|
|
echo "Unsupported arch: ${ARCH}"; \
|
|
exit 1; \
|
|
;; \
|
|
esac; \
|
|
cd /tmp; \
|
|
curl -LfsSo /tmp/clj-kondo.zip ${BINARY_URL}; \
|
|
mkdir -p /opt/utils/bin; \
|
|
cd /opt/utils/bin; \
|
|
unzip /tmp/clj-kondo.zip; \
|
|
rm -rf /tmp/clj-kondo.zip;
|
|
|
|
RUN set -ex; \
|
|
ARCH="$(dpkg --print-architecture)"; \
|
|
case "${ARCH}" in \
|
|
aarch64|arm64) \
|
|
BINARY_URL="https://github.com/babashka/babashka/releases/download/v$BABASHKA_VERSION/babashka-$BABASHKA_VERSION-linux-aarch64-static.tar.gz"; \
|
|
;; \
|
|
amd64|x86_64) \
|
|
BINARY_URL="https://github.com/babashka/babashka/releases/download/v$BABASHKA_VERSION/babashka-$BABASHKA_VERSION-linux-amd64-static.tar.gz"; \
|
|
;; \
|
|
*) \
|
|
echo "Unsupported arch: ${ARCH}"; \
|
|
exit 1; \
|
|
;; \
|
|
esac; \
|
|
cd /tmp; \
|
|
curl -LfsSo /tmp/babashka.tar.gz ${BINARY_URL}; \
|
|
cd /opt/utils/bin; \
|
|
tar -xf /tmp/babashka.tar.gz; \
|
|
rm -rf /tmp/babashka.tar.gz;
|
|
|
|
RUN set -ex; \
|
|
ARCH="$(dpkg --print-architecture)"; \
|
|
case "${ARCH}" in \
|
|
aarch64|arm64) \
|
|
BINARY_URL="https://github.com/prefix-dev/pixi/releases/download/v$PIXI_VERSION/pixi-aarch64-unknown-linux-musl.tar.gz"; \
|
|
;; \
|
|
amd64|x86_64) \
|
|
BINARY_URL="https://github.com/prefix-dev/pixi/releases/download/v$PIXI_VERSION/pixi-x86_64-unknown-linux-musl.tar.gz"; \
|
|
;; \
|
|
*) \
|
|
echo "Unsupported arch: ${ARCH}"; \
|
|
exit 1; \
|
|
;; \
|
|
esac; \
|
|
cd /tmp; \
|
|
curl -LfsSo /tmp/pixi.tar.gz ${BINARY_URL}; \
|
|
cd /opt/utils/bin; \
|
|
tar -xf /tmp/pixi.tar.gz; \
|
|
rm -rf /tmp/pixi.tar.gz;
|
|
|
|
RUN set -ex; \
|
|
ARCH="$(dpkg --print-architecture)"; \
|
|
case "${ARCH}" in \
|
|
aarch64|arm64) \
|
|
BINARY_URL="https://github.com/weavejester/cljfmt/releases/download/${CLJFMT_VERSION}/cljfmt-${CLJFMT_VERSION}-linux-aarch64.tar.gz"; \
|
|
;; \
|
|
amd64|x86_64) \
|
|
BINARY_URL="https://github.com/weavejester/cljfmt/releases/download/${CLJFMT_VERSION}/cljfmt-${CLJFMT_VERSION}-linux-amd64.tar.gz"; \
|
|
;; \
|
|
*) \
|
|
echo "Unsupported arch: ${ARCH}"; \
|
|
exit 1; \
|
|
;; \
|
|
esac; \
|
|
cd /tmp; \
|
|
curl -LfsSo /tmp/cljfmt.tar.gz ${BINARY_URL}; \
|
|
cd /opt/utils/bin; \
|
|
tar -xf /tmp/cljfmt.tar.gz; \
|
|
rm -rf /tmp/cljfmt.tar.gz;
|
|
|
|
|
|
RUN set -ex; \
|
|
ARCH="$(dpkg --print-architecture)"; \
|
|
case "${ARCH}" in \
|
|
aarch64|arm64) \
|
|
BINARY_URL="https://github.com/cli/cli/releases/download/v${GITHUB_CLI_VERSION}/gh_${GITHUB_CLI_VERSION}_linux_arm64.tar.gz"; \
|
|
;; \
|
|
amd64|x86_64) \
|
|
BINARY_URL="https://github.com/cli/cli/releases/download/v${GITHUB_CLI_VERSION}/gh_${GITHUB_CLI_VERSION}_linux_amd64.tar.gz"; \
|
|
;; \
|
|
*) \
|
|
echo "Unsupported arch: ${ARCH}"; \
|
|
exit 1; \
|
|
;; \
|
|
esac; \
|
|
cd /tmp; \
|
|
curl -LfsSo /tmp/gh.tar.gz ${BINARY_URL}; \
|
|
mkdir /opt/gh; \
|
|
cd /opt/gh; \
|
|
tar -xv --strip-components=1 -f /tmp/gh.tar.gz; \
|
|
rm -rf /tmp/gh.tar.gz;
|
|
|
|
# Install AWS CLI
|
|
RUN set -ex; \
|
|
ARCH="$(dpkg --print-architecture)"; \
|
|
case "${ARCH}" in \
|
|
aarch64|arm64) \
|
|
BINARY_ARCH="aarch64"; \
|
|
BINARY_SHA256="e7d2cca3622af4765871fe9ce7eeed03acd09dca10a99ebc46e92f79d78765c0"; \
|
|
;; \
|
|
amd64|x86_64) \
|
|
BINARY_ARCH="x86_64"; \
|
|
BINARY_SHA256="6b3a6a3d7bb3997928f0bdf7b866914224abf242c2e54e1dcebbe84bee64f356"; \
|
|
;; \
|
|
*) \
|
|
echo "Unsupported arch: ${ARCH}"; \
|
|
exit 1; \
|
|
;; \
|
|
esac; \
|
|
BINARY_URL="https://awscli.amazonaws.com/awscli-exe-linux-${BINARY_ARCH}-${AWS_CLI_VERSION}.zip"; \
|
|
curl -LfsSo /tmp/awscliv2.zip ${BINARY_URL}; \
|
|
echo "${BINARY_SHA256} */tmp/awscliv2.zip" | sha256sum -c -; \
|
|
cd /tmp; \
|
|
unzip -q awscliv2.zip; \
|
|
./aws/install --install-dir /opt/utils/aws-cli --bin-dir /opt/utils/bin; \
|
|
rm -rf /tmp/aws /tmp/awscliv2.zip;
|
|
|
|
# Install uv
|
|
RUN set -ex; \
|
|
ARCH="$(dpkg --print-architecture)"; \
|
|
case "${ARCH}" in \
|
|
aarch64|arm64) \
|
|
BINARY_URL="https://github.com/astral-sh/uv/releases/download/${UV_VERSION}/uv-aarch64-unknown-linux-musl.tar.gz"; \
|
|
;; \
|
|
amd64|x86_64) \
|
|
BINARY_URL="https://github.com/astral-sh/uv/releases/download/${UV_VERSION}/uv-x86_64-unknown-linux-musl.tar.gz"; \
|
|
;; \
|
|
*) \
|
|
echo "Unsupported arch: ${ARCH}"; \
|
|
exit 1; \
|
|
;; \
|
|
esac; \
|
|
curl -LfsSo /tmp/uv.tar.gz ${BINARY_URL}; \
|
|
cd /opt/utils/bin; \
|
|
tar -xf /tmp/uv.tar.gz --strip-components=1; \
|
|
rm -rf /tmp/uv.tar.gz;
|
|
|
|
# Install uv-managed tools
|
|
RUN set -ex; \
|
|
/opt/utils/bin/uv tool install -p 3.13 \
|
|
"serena-agent@${SERENA_VERSION}" \
|
|
--prerelease=allow;
|
|
|
|
################################################################################
|
|
## DEVENV BASE
|
|
################################################################################
|
|
|
|
FROM base AS devenv-base
|
|
|
|
RUN set -ex; \
|
|
apt-get -qq update; \
|
|
apt-get -qqy --no-install-recommends install passwd; \
|
|
groupadd -f users; \
|
|
useradd -u 1000 -m -d /home/penpot -G users -s /bin/bash penpot; \
|
|
passwd penpot -d; \
|
|
echo "penpot ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
|
|
|
|
RUN set -ex; \
|
|
apt-get -qq update; \
|
|
apt-get -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade; \
|
|
apt-get -qqy --no-install-recommends install init-system-helpers; \
|
|
apt-get -qqy install --no-install-recommends \
|
|
redis-tools \
|
|
gnupg2 \
|
|
rlwrap \
|
|
file \
|
|
less \
|
|
jq \
|
|
nginx \
|
|
fd-find \
|
|
bat \
|
|
gettext \
|
|
\
|
|
fontconfig \
|
|
woff-tools \
|
|
woff2 \
|
|
python3-tabulate \
|
|
fontforge \
|
|
\
|
|
xvfb \
|
|
fonts-noto-color-emoji \
|
|
fonts-unifont \
|
|
libfontconfig1 \
|
|
libfontconfig-dev \
|
|
libfreetype6 \
|
|
libfreetype-dev \
|
|
xfonts-cyrillic \
|
|
xfonts-scalable \
|
|
fonts-liberation \
|
|
fonts-ipafont-gothic \
|
|
fonts-wqy-zenhei \
|
|
fonts-tlwg-loma-otf \
|
|
fonts-freefont-ttf \
|
|
poppler-utils \
|
|
\
|
|
libasound2 \
|
|
libatk-bridge2.0-0 \
|
|
libatk1.0-0 \
|
|
libatspi2.0-0 \
|
|
libcairo2 \
|
|
libcups2 \
|
|
libdbus-1-3 \
|
|
libdrm2 \
|
|
libgbm1 \
|
|
libglib2.0-0 \
|
|
libnspr4 \
|
|
libnss3 \
|
|
libpango-1.0-0 \
|
|
libx11-6 \
|
|
libxcb1 \
|
|
libxcomposite1 \
|
|
libxdamage1 \
|
|
libxext6 \
|
|
libxfixes3 \
|
|
libxkbcommon0 \
|
|
libxrandr2 \
|
|
\
|
|
libpng16-16 \
|
|
libjpeg62-turbo \
|
|
libtiff6 \
|
|
libwebp7 \
|
|
libfreetype6 \
|
|
libfontconfig1 \
|
|
libglib2.0-0 \
|
|
libxml2 \
|
|
liblcms2-2 \
|
|
libheif1 \
|
|
libopenjp2-7 \
|
|
libzstd1 \
|
|
librsvg2-2 \
|
|
libgomp1 \
|
|
libwebpmux3 \
|
|
libwebpdemux2 \
|
|
libzip5 \
|
|
; \
|
|
rm -rf /var/lib/apt/lists/*; \
|
|
mkdir -p /usr/local/bin; \
|
|
ln -sf /usr/bin/fdfind /usr/local/bin/fd; \
|
|
ln -sf /usr/bin/batcat /usr/local/bin/bat;
|
|
|
|
RUN set -ex; \
|
|
install -d /usr/share/postgresql-common/pgdg; \
|
|
curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc; \
|
|
echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt trixie-pgdg main" >> /etc/apt/sources.list.d/postgresql.list; \
|
|
apt-get -qq update; \
|
|
apt-get -qqy install postgresql-client-18; \
|
|
apt-get clean; \
|
|
rm -rf /var/lib/apt/lists/*;
|
|
|
|
|
|
################################################################################
|
|
## DEVENV
|
|
################################################################################
|
|
|
|
FROM devenv-base AS devenv
|
|
LABEL maintainer="Penpot <docker@penpot.app>"
|
|
|
|
ENV LANG='C.UTF-8' \
|
|
LC_ALL='C.UTF-8' \
|
|
DEBIAN_FRONTEND="noninteractive" \
|
|
JAVA_HOME="/opt/jdk" \
|
|
CARGO_HOME="/opt/cargo" \
|
|
RUSTUP_HOME="/opt/rustup" \
|
|
UV_TOOL_DIR="/opt/uv/tools" \
|
|
UV_TOOL_BIN_DIR="/opt/utils/bin" \
|
|
UV_PYTHON_INSTALL_DIR="/opt/uv/python" \
|
|
SERENA_HOME="/home/penpot/.serena" \
|
|
SERENA_CONTEXT="claude-code" \
|
|
PATH="/opt/jdk/bin:/opt/gh/bin:/opt/utils/bin:/opt/clojure/bin:/opt/node/bin:/opt/imagick/bin:/opt/cargo/bin:$PATH"
|
|
|
|
COPY --from=penpotapp/imagemagick:7.1.2-27-1 /opt/imagick /opt/imagick
|
|
COPY --from=setup-jvm /opt/jdk /opt/jdk
|
|
COPY --from=setup-jvm /opt/clojure /opt/clojure
|
|
COPY --from=setup-node /opt/node /opt/node
|
|
COPY --from=setup-utils /opt/utils /opt/utils
|
|
COPY --from=setup-utils /opt/gh /opt/gh
|
|
COPY --from=setup-utils /opt/uv /opt/uv
|
|
COPY --from=setup-rust /opt/cargo /opt/cargo
|
|
COPY --from=setup-rust /opt/rustup /opt/rustup
|
|
COPY --from=setup-rust /opt/emsdk /opt/emsdk
|
|
COPY --from=setup-caddy /usr/bin/caddy /usr/bin/caddy
|
|
# COPY --from=setup-opencode /tmp/opencode/opencode /opt/utils/bin/opencode
|
|
|
|
COPY files/nginx.conf /etc/nginx/nginx.conf
|
|
COPY files/nginx-mime.types /etc/nginx/mime.types
|
|
COPY files/phantomjs-mock /usr/bin/phantomjs
|
|
|
|
COPY files/bashrc /root/.bashrc
|
|
COPY files/vimrc /root/.vimrc
|
|
COPY files/tmux.conf /root/.tmux.conf
|
|
COPY files/sudoers /etc/sudoers
|
|
|
|
COPY files/Caddyfile /home/
|
|
COPY files/serena_config.yml /home/serena_config.yml
|
|
COPY files/selfsigned.crt /home/
|
|
COPY files/selfsigned.key /home/
|
|
COPY files/start-tmux.sh /home/start-tmux.sh
|
|
COPY files/entrypoint.sh /home/entrypoint.sh
|
|
COPY files/init.sh /home/init.sh
|
|
|
|
ENTRYPOINT ["/home/entrypoint.sh"]
|
|
CMD ["/home/init.sh"]
|