arm docker images, is there any known obstacle or issue for building it? #906
Hello,
I am considering moving html2rss app to a linux/arm64 host and I see there are no arm64 docker images.
Are there any known issues when building arm64 images? Any suggestion regarding this?
Thanks,
Regards,
All reactions
Hi @mabeett, good news!
I’ve carved out some time to improve the Docker setup — and now build images for arm64 as well! That means better support across more environments like Apple Silicon and ARM-based servers.
src:
While at it, I also:
- Enabled SBOM generation — it’s inlined as an OCI label and available as a build artifact.
- Added image versioning via commit SHA — for reproducibility, while latest remains available for rolling releases.
Would love to hear your feedback or suggestions - especially if you spot issues or ideas for further hardening or developer UX improvements. 🚀
If you find this kind of ongoing maintenance helpful, consider sponsoring me on GitHub - it’s a great way ...
Replies: 2 comments 4 replies
Hi,
I haven't tried it, but I would not expect any issues.
I'd be happy to see improvements on the docker build CI, i.e. to stop using the legacy docker build command and pave way for images for different architectures.
This workflow contains the build steps: https://github.com/html2rss/html2rss-web/blob/master/.github/workflows/test_build_push.yml
PRs are welcome!
Cheers!
All reactions
Hi @mabeett, good news!
I’ve carved out some time to improve the Docker setup — and now build images for arm64 as well! That means better support across more environments like Apple Silicon and ARM-based servers.
Screenshot 2025年06月30日 at 18 43 37 src:
While at it, I also:
- Enabled SBOM generation — it’s inlined as an OCI label and available as a build artifact.
- Added image versioning via commit SHA — for reproducibility, while latest remains available for rolling releases.
Would love to hear your feedback or suggestions - especially if you spot issues or ideas for further hardening or developer UX improvements. 🚀
If you find this kind of ongoing maintenance helpful, consider sponsoring me on GitHub - it’s a great way to support the time I invest into making this better for everyone. 🧡
Cheers,
Gil
All reactions
Hi!
Great to know!
I'm having a quite hard week, after current challenges I'll leave my feedback.
I have experience generating local (no ci) builds using podman, after gaining context info I'll be in conditions.
Regards,
All reactions
Hi, hope it's going well for you. Have you had the chance to give the images a test drive? :)
All reactions
Hi,
I hope you are dong well,
I took some time for checking in an aarch64 host:
Details
Client: Docker Engine - Community Version: 27.3.1 Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc.) Version: v0.17.1 Path: /usr/libexec/docker/cli-plugins/docker-buildx compose: Docker Compose (Docker Inc.) Version: v2.29.7 Path: /usr/libexec/docker/cli-plugins/docker-compose Server: Containers: 14 Running: 9 Paused: 0 Stopped: 5 Images: 26 Server Version: 27.3.1 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Using metacopy: false Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: systemd Cgroup Version: 2 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog Swarm: inactive Runtimes: io.containerd.runc.v2 runc Default Runtime: runc Init Binary: docker-init containerd version: 7f7fdf5fed64eb6a7caf99b3e12efcf9d60e311c runc version: v1.1.14-0-g2c9f560 init version: de40ad0 Security Options: seccomp Profile: builtin cgroupns Kernel Version: 6.6.51+rpt-rpi-v8 Operating System: Debian GNU/Linux 12 (bookworm) OSType: linux Architecture: aarch64 CPUs: 4 Total Memory: 3.703GiB Name: focaccia ID: REDACTED Docker Root Dir: /var/lib/docker Debug Mode: false Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false WARNING: No memory limit support WARNING: No swap limit support WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled
I see the application starts, but I found some problems which I uderstand are related with changes from 0.16.0 versions to today:
- In the configuration the key
.feeds.${name}.selectors.updated.post_processmust be a list, while a dictionary was accepted. I could not find information in the docs as some links in the web are broken. So in case of being a bug, the clarification in the documentation would be helpful. - The information in
.stylesheetsis not inherited nor mixed with.feeds.${name}.as in the past. - Since feat: integrate request_service and use ssrf_filter strategy by default html2rss-web#707 in html2rss/html2rss-web@b7516fd there is no way for using a private-network-hosted webpage as
.feeds.${name}.channel.url. From what I see in Add option to disable unsafe IP protection arkadiyt/ssrf_filter#59 a bypass should be in charge of html2rss. I leave below a test script which has been used with podman and docker in linux/amd64 hosts. - I can't deny nor confirm the information in
.headersis mixed or inherited with.feeds.${name}.
Test script
Details
#!/bin/bash set -x # cd `mktemp -d` mkdir -p templates/ cat <<EOF >app.py from flask import Flask from flask import render_template from datetime import datetime app = Flask(__name__) @app.route('/') @app.route('/<name>') def hello(name=None): return render_template('hello.html', name=name, date=datetime.now()) if __name__ == '__main__': app.run(host='0.0.0.0', port=8000) EOF cat <<EOF >templates/hello.html <!DOCTYPE html> <html> <head> {% if name %} <title>Title for {{ name }}</title> {% else %} <title>Title {{ name }}</title> {% endif %} </head> <body> <div class="foo"> {% if name %} <h1><a href="https://google.com/search?q={{ date}}">Hello {{ name }}! at {{ date }}</a></h1> <div class="item">{{ date }} - {{ name }} random description</div> {% else %} <h1>Hello, World!</h1> <div class="item">nada - nada random description</div> {% endif %} </div> </body> </html> EOF cat <<'EOF' >Dockerfile FROM python:3.10-alpine AS builder WORKDIR /app RUN pip3 install Flask==2.2.3 Werkzeug==2.2.2 RUN mkdir -p /app/templates COPY . /app ENTRYPOINT ["python3"] CMD ["app.py"] FROM builder AS dev-envs RUN \ apk update && \ apk add git EOF cat <<'EOF' >docker-compose.yml version: "3.2" services: web: build: context: ./ image: local/someflask stop_signal: SIGINT ports: - '8000:8000' html2rss-web: image: gilcreator/html2rss-web ports: - "3001:3000" volumes: - type: bind source: ./feeds.yml target: /app/config/feeds.yml read_only: true bind: selinux: Z environment: - RACK_ENV=production - HEALTH_CHECK_USERNAME=health - HEALTH_CHECK_PASSWORD=please-set-YOUR-OWN-veeeeeery-l0ng-aNd-h4rd-to-gue55-Passw0rd - WEB_MAX_THREADS=1 - WEB_CONCURRENCY=1 EOF cat <<'EOF' >feeds.yml stylesheets: - href: "/rss.xsl" media: "all" type: "text/xsl" headers: "User-Agent": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" feeds: failer: channel: url: http://web:8000/%<id>s title: Test web - %<id>s ttl: 120 selectors: items: selector: "div.foo" title: selector: "h1" link: selector: "h1 > a" extractor: "href" description: selector: "div.item" EOF docker compose up --build -d while sleep 1; do curl -s http://localhost:3001/ >/dev/null && break ; done curl -s "http://localhost:3001/failer.rss?id=foo"
output from html2rss:
Details
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="referrer" content="no-referrer"/> <meta name="robots" content="noindex, noarchive"/> <title>html2rss-web - Internal Server Error</title> <link href="/water.css" rel="stylesheet"/> <link href="/styles.css" rel="stylesheet"/> </head> <body> <aside class="aside-icon"> <a href="https://html2rss.github.io/"> <img src="/favicon.ico" alt="HTML2RSS icon" /> </a> </aside> <h1>500 - Internal Server Error</h1> <pre> SsrfFilter::PrivateIPAddress: Hostname 'web' has no public ip addresses </pre> <section> <h2>Need help?</h2> <p> Browse the <a href="https://html2rss.github.io/" rel="noopener noreferrer"> html2rss project website </a> or start a <a href="https://github.com/orgs/html2rss/discussions" rel="noopener noreferrer"> discussion on Github. </a> </p> </section> </body> </html>
</details?
All reactions
Hi,
Thanks so much for your update and the thoughtful feedback.
I’m in the middle of some larger changes across the project. The web app currently runs the gem straight from git, so changes have been piling up without a formal changelog. Until there’s a proper release, I flag breaking changes in commit messages with an exclamation mark (e.g. feat!: xyz).
You’re absolutely right — the dictionary change was a breaking one. The stylesheet issue should be resolved since yesterday, apologies for letting that slip through.
On the documentation side, I recently merged a large restructuring. That unfortunately brought along some AI-generated noise, but I’ve done a significant cleanup yesterday as well. If you spot anything still off, please let me know — that kind of feedback really helps.
I think we’re getting close to a proper release, and I’m excited about where the project is heading. Thanks again for engaging and for your patience — contributions, testing, and feedback like yours keep the work moving forward.
I personally see no need to make exceptions on SSRF filtering, but would accept a Pull Requests which gates this behind a env var.
Cheers,
Gil
All reactions
-
👍 1