Skip to content

Navigation Menu

Sign in
Sign up

arm docker images, is there any known obstacle or issue for building it? #906

Answered by gildesmarais
mabeett asked this question in General
Discussion options

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,

You must be logged in to vote

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:

  1. Enabled SBOM generation — it’s inlined as an OCI label and available as a build artifact.
  2. 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

Comment options

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!

You must be logged in to vote
0 replies
Comment options

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:

  1. Enabled SBOM generation — it’s inlined as an OCI label and available as a build artifact.
  2. 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

You must be logged in to vote
4 replies
Comment options

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,

Comment options

Hi, hope it's going well for you. Have you had the chance to give the images a test drive? :)

Comment options

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_process must 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 .stylesheets is 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 .headers is 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 &#39;web&#39; 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?

Comment options

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

Answer selected by gildesmarais
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet

AltStyle によって変換されたページ (->オリジナル) /