Files
hassio-addons/mealie/Dockerfile
Alexandre 62bbecb465 fix(mealie): build the frontend with pnpm and the upstream lockfile (#3046)
* fix(mealie): build the frontend with pnpm and the upstream lockfile

Upstream mealie migrated frontend/ from yarn to pnpm in v3.24.0 and deleted
frontend/yarn.lock. Our builder stage kept running "yarn install
--frozen-lockfile", which silently degraded to a fresh, unpinned resolution of
every dependency. That worked until a newer vuetify 4.x release dropped the
"vuetify/labs/rules" entry point, at which point "nuxt generate" failed with:

  Rolldown failed to resolve import "vuetify/labs/rules" from
  "virtual:nuxt:.nuxt%2Fvuetify-nuxt-plugin.client.mjs"

and the v3.25.1 updater build was reverted.

Mirror upstream's docker/Dockerfile frontend stage instead: node:24, a global
pnpm@11, and "pnpm install --frozen-lockfile" against the committed
pnpm-lock.yaml, so the dependency set is the one upstream tests. Also copy the
frontend tree with "cp -a frontend/." so dotfiles such as .nuxtignore come
across, and shallow-clone the tag.

Bumps the add-on to v3.25.1, the version the updater bot could not build.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* chore: record the shipped upstream release in updater.json

Each PR publishes an upstream version the updater bot had already selected
before CI reverted its commit, but updater.json still recorded the previous one.
The updater reads upstream_version as CURRENT and enters its update path
whenever it differs from the latest tag, so its next run would process the same
release again and derive a synthetic trailing-.1 version, producing a redundant
release, a duplicate CHANGELOG entry and a wasted build.

These values are exactly what the bot itself wrote in the reverted commit; this
restores its own record for a release now being shipped rather than choosing a
new one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 07:47:32 +02:00

157 lines
4.6 KiB
Docker

#============================#
# ALEXBELGIUM'S DOCKERFILE #
#============================#
# _.------.
# _.-` ('>.-`"""-.
# '.--'` _'` _ .--.)
# -' '-.-';` `
# ' - _.' ``'--.
# '---` .-'""`
# /`
#=== Home Assistant Addon ===#
#################
# 1 Build Image #
#################
# Stage 1: Build Frontend with SUB_PATH
# Mirrors upstream docker/Dockerfile: node:24 + pnpm, installing from the
# committed pnpm-lock.yaml. Upstream dropped frontend/yarn.lock in v3.24.0, so a
# yarn install here resolved every dependency fresh and eventually picked a
# vuetify release without "vuetify/labs/rules", breaking "nuxt generate".
FROM node:24 AS frontend-builder
# Set the SUB_PATH environment variable
ARG SUB_PATH="/mealie/"
ENV SUB_PATH=$SUB_PATH
ENV MEALIE_VERSION="v3.25.1"
RUN npm install --global pnpm@11
# Clone the Mealie repository to get the frontend source code
WORKDIR /frontend
# hadolint ignore=DL3003
RUN mkdir -p /frontend/tempdir && cd /frontend/tempdir && \
git clone --depth 1 --branch "$MEALIE_VERSION" https://github.com/mealie-recipes/mealie.git . && \
cp -a frontend/. /frontend/ && cd /frontend && rm -rf tempdir && \
pnpm install --frozen-lockfile
# Build the frontend
RUN pnpm generate
# Stage 2: Build the Final Image
FROM hkotel/mealie:latest
# Copy the rebuilt frontend files into the final image
WORKDIR /mealie
COPY --from=frontend-builder /frontend/dist /mealie/frontend
##################
# 2 Modify Image #
##################
# Set S6 wait time
ENV S6_CMD_WAIT_FOR_SERVICES=1 \
S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \
S6_SERVICES_GRACETIME=0
# Correct data path
# hadolint ignore=DL4006,DL3003
RUN \
# Copy frontend
cd /opt/mealie/lib/python*/site-packages/mealie && \
rm -r frontend && mv /mealie/frontend . && \
# avoid changing user
sed -i "s|change_user$|# change_user|g" /app/run.sh && sed -i 's|\${!file_var}|${!file_var:-}|g' /app/run.sh
##################
# 3 Install apps #
##################
# Add rootfs
COPY rootfs/ /
RUN find . -type f \( -name "*.sh" -o -name "run" -o -name "finish" \) -print -exec chmod +x {} \;
# Uses /bin for compatibility purposes
# hadolint ignore=DL4005
RUN if [ ! -f /bin/sh ] && [ -f /usr/bin/sh ]; then ln -s /usr/bin/sh /bin/sh; fi && \
if [ ! -f /bin/bash ] && [ -f /usr/bin/bash ]; then ln -s /usr/bin/bash /bin/bash; fi
# Modules
ARG MODULES="00-banner.sh 01-custom_script.sh"
# Automatic modules download
COPY ha_automodules.sh /ha_automodules.sh
RUN chmod 744 /ha_automodules.sh && /ha_automodules.sh "$MODULES" && rm /ha_automodules.sh
# Manual apps
ENV PACKAGES="nginx"
# Automatic apps & bashio
COPY ha_autoapps.sh /ha_autoapps.sh
RUN chmod 744 /ha_autoapps.sh && /ha_autoapps.sh "$PACKAGES" && rm /ha_autoapps.sh
################
# 4 Entrypoint #
################
# Add entrypoint
ENV S6_STAGE2_HOOK=/ha_entrypoint.sh
COPY ha_entrypoint.sh /ha_entrypoint.sh
RUN chmod 777 /ha_entrypoint.sh
# Install bashio
COPY bashio-standalone.sh /usr/local/lib/bashio-standalone.sh
RUN chmod 0755 /usr/local/lib/bashio-standalone.sh
RUN \
# Apply custom instructions to run.sh
sed -i '1d' /app/run.sh \
&& cat /app/run.sh >> /run.txt \
&& cat /run.txt > /app/run.sh \
&& chmod +x /app/run.sh
# Expose necessary ports
EXPOSE 9000
# Set the entrypoint
ENTRYPOINT ["/app/run.sh"]
############
# 5 Labels #
############
ARG BUILD_ARCH
ARG BUILD_DATE
ARG BUILD_DESCRIPTION
ARG BUILD_NAME
ARG BUILD_REF
ARG BUILD_REPOSITORY
ARG BUILD_VERSION
ENV BUILD_VERSION="${BUILD_VERSION}"
LABEL \
io.hass.name="${BUILD_NAME}" \
io.hass.description="${BUILD_DESCRIPTION}" \
io.hass.arch="${BUILD_ARCH}" \
io.hass.type="addon" \
io.hass.version=${BUILD_VERSION} \
maintainer="alexbelgium (https://github.com/alexbelgium)" \
org.opencontainers.image.title="${BUILD_NAME}" \
org.opencontainers.image.description="${BUILD_DESCRIPTION}" \
org.opencontainers.image.vendor="Home Assistant Add-ons" \
org.opencontainers.image.authors="alexbelgium (https://github.com/alexbelgium)" \
org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.url="https://github.com/alexbelgium" \
org.opencontainers.image.source="https://github.com/${BUILD_REPOSITORY}" \
org.opencontainers.image.documentation="https://github.com/${BUILD_REPOSITORY}/blob/main/README.md" \
org.opencontainers.image.created=${BUILD_DATE} \
org.opencontainers.image.revision=${BUILD_REF} \
org.opencontainers.image.version=${BUILD_VERSION}
#################
# 6 Healthcheck #
#################
# Use upstream