Runway
Runway is built and operated in the EU!

No port

First steps

Runway usually enforces that apps EXPOSE a port (and listen on that port).

That can be switched off via runway app route off (and switched back on via runway app route on).

Example

Create the project:

mkdir non-server-app && cd non-server-app

With the following Dockerfile:

Dockerfile
FROM alpine
RUN addgroup --gid 1001 mygroup && \
    adduser -D --ingroup mygroup --uid 1001 myuser
USER 1001:1001
CMD sleep infinity # or something a bit more useful, in practice

Create the app on Runway (this also initializes a git repository, if none exists yet), then commit the Dockerfile and turn its port requirement off:

runway app create
git add -A && git commit -m "add Dockerfile"
runway app route off

Deploy to Runway

runway app deploy

View it in the Runway UI. Check runway app logs if something’s off.

The app should then deploy and start.

As with any other app, runway app exec sh can be used to get an interactive shell on the container, if necessary.