diff --git a/docker/imagemagick/Dockerfile b/docker/imagemagick/Dockerfile new file mode 100644 index 0000000000..5800979878 --- /dev/null +++ b/docker/imagemagick/Dockerfile @@ -0,0 +1,91 @@ +FROM ubuntu:24.04 +LABEL maintainer="Penpot " + +ENV LANG='C.UTF-8' \ + LC_ALL='C.UTF-8' \ + DEBIAN_FRONTEND=noninteractive \ + TZ=Etc/UTC + +ARG IMAGEMAGICK_VERSION=7.1.1-47 + +RUN set -e; \ + apt-get -qq update; \ + apt-get -qq upgrade; \ + apt-get -qqy --no-install-recommends install \ + autoconf \ + binutils \ + build-essential \ + ca-certificates \ + curl \ + libfftw3-dev \ + libheif-dev \ + libjpeg-dev \ + liblcms2-dev \ + libltdl-dev \ + liblzma-dev \ + libopenexr-dev \ + libpng-dev \ + librsvg2-dev \ + libtiff-dev \ + libtool \ + libwebp-dev \ + libzip-dev \ + libzstd-dev \ + pkg-config \ + ; \ + curl -LfsSo /tmp/magick.tar.gz https://github.com/ImageMagick/ImageMagick/archive/refs/tags/${IMAGEMAGICK_VERSION}.tar.gz; \ + mkdir -p /tmp/magick; \ + cd /tmp/magick; \ + tar -xf /tmp/magick.tar.gz --strip-components=1; \ + ./configure --prefix=/opt/imagick; \ + make -j 2; \ + make install; \ + rm -rf /opt/imagick/lib/libMagick++*; \ + rm -rf /opt/imagick/include; \ + rm -rf /opt/imagick/share; \ + apt-get -qqy --autoremove purge \ + autoconf \ + binutils \ + build-essential \ + ca-certificates \ + curl \ + libfftw3-dev \ + libheif-dev \ + libjpeg-dev \ + liblcms2-dev \ + libltdl-dev \ + liblzma-dev \ + libopenexr-dev \ + libpng-dev \ + librsvg2-dev \ + libtiff-dev \ + libtool\ + libwebp-dev \ + libzip-dev \ + libzstd-dev \ + pkg-config \ + ;\ + apt-get -qqy --no-install-recommends install \ + libfontconfig1 \ + libfreetype6 \ + libglib2.0-0 \ + libgomp1 \ + libheif1 \ + libjpeg-turbo8 \ + liblcms2-2 \ + libopenexr-3-1-30 \ + libopenjp2-7 \ + libpng16-16 \ + librsvg2-2 \ + libtiff6 \ + libwebp7 \ + libwebpdemux2 \ + libwebpmux3 \ + libxml2 \ + libzip4t64 \ + libzstd1 \ + ;\ + apt-get -qqy clean; \ + rm -rf /var/lib/apt/lists/*; + +ENTRYPOINT ["/opt/imagick/bin/magick"] diff --git a/docker/images/Dockerfile.backend b/docker/images/Dockerfile.backend index 045d35a0ae..b8d59818e9 100644 --- a/docker/images/Dockerfile.backend +++ b/docker/images/Dockerfile.backend @@ -6,37 +6,18 @@ ENV LANG='C.UTF-8' \ JAVA_HOME="/opt/jdk" \ DEBIAN_FRONTEND=noninteractive \ NODE_VERSION=v22.16.0 \ - IMAGEMAGICK_VERSION=7.1.1-47 \ TZ=Etc/UTC RUN set -ex; \ apt-get -qq update; \ apt-get -qq upgrade; \ apt-get -qqy --no-install-recommends install \ - curl \ - ca-certificates \ binutils \ - build-essential autoconf libtool pkg-config \ - libltdl-dev \ - libpng-dev libjpeg-dev libtiff-dev libwebp-dev libopenexr-dev libfftw3-dev \ - libzip-dev \ - liblcms2-dev liblzma-dev libzstd-dev \ - libheif-dev librsvg2-dev \ + ca-certificates \ + curl \ ; \ rm -rf /var/lib/apt/lists/* -RUN set -eux; \ - curl -LfsSo /tmp/magick.tar.gz https://github.com/ImageMagick/ImageMagick/archive/refs/tags/${IMAGEMAGICK_VERSION}.tar.gz; \ - mkdir -p /tmp/magick; \ - cd /tmp/magick; \ - tar -xf /tmp/magick.tar.gz --strip-components=1; \ - ./configure --prefix=/opt/imagick; \ - make -j 2; \ - make install; \ - rm -rf /opt/imagick/lib/libMagick++*; \ - rm -rf /opt/imagick/include; \ - rm -rf /opt/imagick/share; - RUN set -eux; \ ARCH="$(dpkg --print-architecture)"; \ case "${ARCH}" in \ @@ -105,33 +86,33 @@ RUN set -ex; \ apt-get -qq update; \ apt-get -qq upgrade; \ apt-get -qqy --no-install-recommends install \ - tzdata \ ca-certificates \ fontconfig \ - woff-tools \ - woff2 \ + fontforge \ python3 \ python3-tabulate \ - fontforge \ + tzdata \ + woff-tools \ + woff2 \ \ - libpng16-16 \ + libfontconfig1 \ + libfreetype6 \ + libglib2.0-0 \ + libgomp1 \ + libheif1 \ libjpeg-turbo8 \ + liblcms2-2 \ + libopenexr-3-1-30 \ + libopenjp2-7 \ + libpng16-16 \ + librsvg2-2 \ libtiff6 \ libwebp7 \ - libopenexr-3-1-30 \ - libfreetype6 \ - libfontconfig1 \ - libglib2.0-0 \ - libxml2 \ - liblcms2-2 \ - libheif1 \ - libopenjp2-7 \ - libzstd1 \ - librsvg2-2 \ - libgomp1 \ - libwebpmux3 \ libwebpdemux2 \ + libwebpmux3 \ + libxml2 \ libzip4t64 \ + libzstd1 \ ; \ find tmp/usr/share/zoneinfo/* -type d ! -name 'Etc' |xargs rm -rf; \ rm -rf /var/lib /var/cache; \ @@ -144,7 +125,7 @@ RUN set -ex; \ COPY --from=build /opt/jre /opt/jre COPY --from=build /opt/node /opt/node -COPY --from=build /opt/imagick /opt/imagick +COPY --from=penpotapp/imagemagick:7.1.1-47 /opt/imagick /opt/imagick COPY --chown=penpot:penpot ./bundle-backend/ /opt/penpot/backend/ USER penpot:penpot diff --git a/manage.sh b/manage.sh index ded023d661..90f69239b9 100755 --- a/manage.sh +++ b/manage.sh @@ -7,6 +7,7 @@ export DEVENV_PNAME="penpotdev"; export CURRENT_USER_ID=$(id -u); export CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD); +export IMAGEMAGICK_VERSION=7.1.1-47 # Safe directory to avoid ownership errors with Git git config --global --add safe.directory /home/penpot/penpot || true @@ -16,16 +17,23 @@ export JAVA_OPTS=${JAVA_OPTS:-"-Xmx1000m -Xms50m"}; set -e +ARCH=$(uname -m) + +if [[ "$ARCH" == "x86_64" || "$ARCH" == "i386" || "$ARCH" == "i686" ]]; then + ARCH="amd64" +elif [[ "$ARCH" == "aarch64" || "$ARCH" == "arm64" ]]; then + ARCH="arm64" +else + echo "Unknown architecture $ARCH" + exit -1 +fi + + function print-current-version { echo -n "$(git describe --tags --match "*.*.*")"; } -function build-devenv { - set +e; - echo "Building development image $DEVENV_IMGNAME:latest..." - - pushd docker/devenv; - +function setup-buildx { docker run --privileged --rm tonistiigi/binfmt --install all docker buildx inspect penpot > /dev/null 2>&1; @@ -36,19 +44,28 @@ function build-devenv { docker buildx use penpot; docker buildx inspect --bootstrap > /dev/null 2>&1; fi - - # docker build -t $DEVENV_IMGNAME:latest . - docker buildx build --platform linux/amd64,linux/arm64 --push -t $DEVENV_IMGNAME:latest .; - docker pull $DEVENV_IMGNAME:latest; - - popd; } -function build-devenv-local { - echo "Building local only development image $DEVENV_IMGNAME:latest..." +function build-devenv { + set +e; pushd docker/devenv; - docker build -t $DEVENV_IMGNAME:latest .; + + if [ "$1" = "--local" ]; then + echo "Build local only $DEVENV_IMGNAME:latest image"; + docker build -t $DEVENV_IMGNAME:latest .; + else + echo "Build and push $DEVENV_IMGNAME:latest image"; + setup-buildx; + + docker buildx build \ + --platform linux/amd64,linux/arm64 \ + --output type=registry \ + -t $DEVENV_IMGNAME:latest .; + + docker pull $DEVENV_IMGNAME:latest; + fi + popd; } @@ -124,6 +141,32 @@ function run-devenv-isolated-shell { $DEVENV_IMGNAME:latest sudo -EH -u penpot bash } +function build-imagemagick-docker-image { + set +e; + echo "Building image penpotapp/imagemagick:$IMAGEMAGICK_VERSION" + + pushd docker/imagemagick; + + output_option="type=registry"; + platform="linux/amd64,linux/arm64"; + + if [ "$1" = "--local" ]; then + output_option="type=docker"; + platform="linux/$ARCH" + fi + + setup-buildx; + + docker buildx build \ + --build-arg IMAGEMAGICK_VERSION=$IMAGEMAGICK_VERSION \ + --platform $platform \ + --output $output_option \ + -t penpotapp/imagemagick:latest \ + -t penpotapp/imagemagick:$IMAGEMAGICK_VERSION .; + + popd; +} + function build { echo ">> build start: $1" local version=$(print-current-version); @@ -219,21 +262,21 @@ function build-docs-bundle { echo ">> bundle docs end"; } -function build-frontend-docker-images { +function build-frontend-docker-image { rsync -avr --delete ./bundles/frontend/ ./docker/images/bundle-frontend/; pushd ./docker/images; docker build -t penpotapp/frontend:$CURRENT_BRANCH -t penpotapp/frontend:latest -f Dockerfile.frontend .; popd; } -function build-backend-docker-images { +function build-backend-docker-image { rsync -avr --delete ./bundles/backend/ ./docker/images/bundle-backend/; pushd ./docker/images; docker build -t penpotapp/backend:$CURRENT_BRANCH -t penpotapp/backend:latest -f Dockerfile.backend .; popd; } -function build-exporter-docker-images { +function build-exporter-docker-image { rsync -avr --delete ./bundles/exporter/ ./docker/images/bundle-exporter/; pushd ./docker/images; docker build -t penpotapp/exporter:$CURRENT_BRANCH -t penpotapp/exporter:latest -f Dockerfile.exporter .; @@ -246,7 +289,7 @@ function usage { echo "Options:" echo "- pull-devenv Pulls docker development oriented image" echo "- build-devenv Build docker development oriented image" - echo "- build-devenv-local Build a local docker development oriented image" + echo "- build-devenv --local Build a local docker development oriented image" echo "- create-devenv Create the development oriented docker compose service." echo "- start-devenv Start the development oriented docker compose service." echo "- stop-devenv Stops the development oriented docker compose service." @@ -263,9 +306,9 @@ function usage { echo "- build-docs-bundle Build docs bundle." echo "" echo "- build-docker-images Build all docker images (frontend, backend and exporter)." - echo "- build-frontend-docker-images Build frontend docker images." - echo "- build-backend-docker-images Build backend docker images." - echo "- build-exporter-docker-images Build exporter docker images." + echo "- build-frontend-docker-image Build frontend docker images." + echo "- build-backend-docker-image Build backend docker images." + echo "- build-exporter-docker-image Build exporter docker images." echo "" echo "- version Show penpot's version." } @@ -281,11 +324,8 @@ case $1 in ;; build-devenv) - build-devenv ${@:2} - ;; - - build-devenv-local) - build-devenv-local ${@:2} + shift; + build-devenv $@; ;; create-devenv) @@ -339,25 +379,30 @@ case $1 in build-docs-bundle; ;; + build-imagemagick-docker-image) + shift; + build-imagemagick-docker-image $@; + ;; + build-docker-images) - build-frontend-docker-images - build-backend-docker-images - build-exporter-docker-images + build-frontend-docker-image + build-backend-docker-image + build-exporter-docker-image ;; - build-frontend-docker-images) - build-frontend-docker-images + build-frontend-docker-image) + build-frontend-docker-image ;; - build-backend-docker-images) - build-backend-docker-images + build-backend-docker-image) + build-backend-docker-image ;; - build-exporter-docker-images) - build-exporter-docker-images + build-exporter-docker-image) + build-exporter-docker-image ;; *) usage ;; -esac \ No newline at end of file +esac