Minimal Docker image that fetches and executes shell scripts from URLs. Uses mvdan/sh, a POSIX shell interpreter written in pure Go.
Published on Docker Hub as installable/sh.
FROM installable/sh AS installable
FROM ubuntu:latest
COPY --from=installable / /The COPY --from=installable / / pattern adds the RUN and INSTALL binaries to any base image, allowing scripts to use the base image's utilities.
| Command | Description | Status |
|---|---|---|
RUN |
Fetch and execute scripts at runtime | Ready |
INSTALL |
Installation and setup tasks during builds | WIP |
See the examples directory for more examples.
Fetch and execute scripts at runtime.
CMD ["RUN", "https://example.com/script.sh", "arg1", "arg2"]Use +env to send environment variables as HTTP headers when fetching scripts:
CMD ["RUN", "+env", "https://example.com/script.sh"]Each environment variable is sent as an X-Env-* header:
API_KEY=secret→X-Env-API_KEY: secretFOO=bar→X-Env-FOO: bar
This allows dynamic script generation based on the container's environment.
The default User-Agent is run/1.0 (installable). Set the USER_AGENT environment variable to override it:
ENV USER_AGENT="MyApp/1.0"
CMD ["RUN", "https://example.com/script.sh"]Use +raw to print the fetched script without executing it:
RUN +raw https://example.com/script.shThis is useful for debugging or piping the script to another tool.
Use +nocache to request fresh content from the origin server:
RUN +nocache https://example.com/script.shThis sets Cache-Control: no-cache, no-store, must-revalidate and Pragma: no-cache headers.
- Minimal footprint: Small image with embedded CA certificates
- No shell required: The POSIX shell interpreter is embedded in the Go binary
- Argument passing: Pass arguments to scripts via
$1,$2, etc. - HTTPS support: CA certificates embedded in the binary
- Environment forwarding: Send env vars as HTTP headers with
+env - Custom User-Agent: Set
USER_AGENTenv var to customize the request header - Raw output: Use
+rawto print the script without executing - Cache bypass: Use
+nocacheto skip CDN caches - Compatible: Overlay onto any base image with
COPY --from=installable / /
🚧 Work in Progress 🚧
The INSTALL command is under development and will be available in a future release. It is intended for installation and setup tasks during Docker image builds.
make # Setup, format, lint, test, and build| Target | Description |
|---|---|
make |
Run all: setup, fmt, lint, test, build |
make setup |
Install git hooks and golangci-lint |
make fmt |
Format code with gofmt |
make lint |
Run golangci-lint |
make check |
Check formatting (CI) |
make test |
Run tests |
make RUN |
Build RUN binary |
make INSTALL |
Build INSTALL binary |
make clean |
Remove binaries and test cache |
docker build -t installable/sh .Note: The Dockerfile copies CA certificates from Alpine's ca-certificates package during the build. The certificates in internal/certs/ are placeholders for local development only.
- Scripts must be POSIX-compliant (no bash-specific features like arrays,
[[,set -E, etc.) - External commands must exist in the base image
Copyright 2026 Scaffoldly LLC
Apache 2.0