Compare commits

..

19 Commits

Author SHA1 Message Date
Jason Swank
a23415c69a update direnv setup 2026-01-23 18:23:08 +00:00
Jason Swank
9d35f280dd add direnv hook 2026-01-20 15:33:39 +00:00
Jason Swank
92a48b1628 add direnv 2026-01-20 15:28:00 +00:00
Jason Swank
b152fc3e7a tag image 3 & latest 2026-01-10 14:10:09 +00:00
Jason Swank
97b420972b ensure jq is installed 2026-01-10 14:00:04 +00:00
Jason Swank
ea2cb2a7ae fix annotations 2026-01-10 13:58:30 +00:00
Jason Swank
c7ebf79dc3 3 2026-01-10 02:46:34 +00:00
Jason Swank
56bab3ee6d use rootless podman 2026-01-10 02:33:34 +00:00
Jason Swank
2640cf7d6b add cgroups 2026-01-10 02:18:33 +00:00
Jason Swank
631a7a874c add iptables 2026-01-10 02:17:28 +00:00
Jason Swank
69314c5467 add tun 2026-01-10 02:12:36 +00:00
Jason Swank
97f8c449b5 fix git url 2026-01-10 02:10:18 +00:00
Jason Swank
95508baf93 update secrets 2026-01-10 02:02:37 +00:00
Jason Swank
d54de3d826 rm just 2026-01-10 01:59:12 +00:00
Jason Swank
6bf9507053 update build 2026-01-10 01:53:12 +00:00
Jason Swank
66763da932 wip 2026-01-10 01:48:07 +00:00
7111fd4d2a add .npmrc 2025-12-19 12:02:53 -05:00
b39a07918a add curl 2025-06-09 11:55:40 -04:00
Jason Swank
f1b519d143 Taskfile: improve desc 2024-08-11 18:01:18 -04:00
9 changed files with 73 additions and 47 deletions

View File

@@ -1,30 +1,41 @@
image: alpine/latest image: alpine/latest
secrets: secrets:
- 0f9c437f-5dfc-49f1-abfb-0030f265c018
- 0ee986ff-5686-43cd-ac3a-1fe5b2e5dd8f - 0ee986ff-5686-43cd-ac3a-1fe5b2e5dd8f
- f523ee29-5ef8-490f-8903-43ad7c49060b - f523ee29-5ef8-490f-8903-43ad7c49060b
- 130adee5-3a8f-4035-8cad-e3d044be2961 - 130adee5-3a8f-4035-8cad-e3d044be2961
sources: sources:
- https://git.sr.ht/~jswank/alpine-cli#3 - git@git.sr.ht:~jswank/alpine-cli
packages: packages:
- podman - podman
- just - iptables
- runit - runit
- go-task
- qemu-openrc
- qemu-modules
- qemu-aarch64
- jq
tasks: tasks:
# cgroups need to be running in order to run podman
- prep: | - prep: |
# cgroups need to be running in order to run podman
sudo rc-service cgroups start sudo rc-service cgroups start
# qemu binfmt is required for cross-platform builds
sudo rc-service qemu-binfmt start
# allow rootless podman
echo $USER:100000:65536 | sudo tee /etc/subuid
echo $USER:100000:65536 | sudo tee /etc/subgid
sleep 1 sleep 1
# build the image using the just recipe # build the image using the just recipe
# - sudo (-u root) is required to run podman without more setup # - sudo (-u root) is required to run podman without more setup
- build: | - build: |
cd alpine-cli cd alpine-cli
sudo --preserve-env just build go-task build
# sudo --preserve-env go-task build
# publish the image using the just recipe # publish the image using the just recipe
# - set environment variables from the ~/.envdir directory. see # - set environment variables from the ~/.envdir directory. see
@@ -33,7 +44,6 @@ tasks:
# - sudo --preserve-env is required to pass environment variables # - sudo --preserve-env is required to pass environment variables
- publish: | - publish: |
cd alpine-cli cd alpine-cli
chpst -e ~/.envdir sudo --preserve-env just registry_pass_var=GH_PAT publish chpst -e ~/.envdir go-task publish
# chpst -e ~/.envdir sudo --preserve-env go-task publish
# chpst -e ~/.envdir sudo --preserve-env just registry=docker.io registry_pass_var=DH_PAT publish # chpst -e ~/.envdir sudo --preserve-env just registry=docker.io registry_pass_var=DH_PAT publish
# chpst -e ~/.envdir sudo --preserve-env just registry=quay.io registry_pass_var=QUAY_PAT publish # chpst -e ~/.envdir sudo --preserve-env just registry=quay.io registry_pass_var=QUAY_PAT publish

View File

@@ -1,17 +1,12 @@
FROM docker.io/library/alpine:3 FROM docker.io/library/alpine:3
LABEL org.opencontainers.image.title=jswank/alpine-cli \
org.opencontainers.image.description="A minimal image for running Linux CLI utilities" \
org.opencontainers.image.url=https://git.sr.ht/~jswank/alpine-cli \
org.opencontainers.image.authors="Jason Swank" \
org.opencontainers.image.licenses=MIT
RUN apk --no-cache update RUN apk --no-cache update
RUN apk -U --no-cache add \ RUN apk -U --no-cache add \
doas doas-sudo-shim \ doas doas-sudo-shim \
bash less openvi \ bash less openvi \
coreutils grep gawk perl coreutils grep gawk perl \
curl direnv bind-tools
RUN adduser -h /home/cli -s /bin/bash -D cli cli && \ RUN adduser -h /home/cli -s /bin/bash -D cli cli && \
addgroup cli wheel && \ addgroup cli wheel && \

View File

@@ -23,9 +23,8 @@ exit
## More Info ## More Info
The image is based on *alpine:3*, with a small amount of additional The image is based on *alpine:3* with a small amount of additional setup/installation.
setup/installation done. See the [Dockerfile](Dockerfile) and [ctx/home](ctx) See the [Dockerfile](Dockerfile) and [ctx/home](ctx) for the specifics.
for the specifics.
- Some basic utilities are installed for interative and script-based shell usage - Some basic utilities are installed for interative and script-based shell usage
- A user is created with sudo (`-u root`) access. - A user is created with sudo (`-u root`) access.
@@ -38,9 +37,9 @@ See ghcr.io/jswank/alpine-cli for current available images.
## Helper Script ## Helper Script
A helper script, using [casey/just](https://github.com/casey/just') is in [bin/cli](./bin/cli) is a helper script using
[bin/cli](bin/cli). It can be used to quickly start an ephemeral (or [casey/just](https://github.com/casey/just'). It can be used to quickly start an
persistent) container. ephemeral (or persistent) container.
```console ```console
$ bin/cli help $ bin/cli help

View File

@@ -11,21 +11,41 @@ tasks:
default: default:
cmds: cmds:
- task: build - task: build
build: build:
desc: build a new image desc: build a new image; use CLI_ARGS to pass additional arguments (build -- --no-cache).
cmds: cmds:
- (podman manifest exists {{.IMAGE}}:{{.TAG}} && podman manifest rm {{.IMAGE}}:{{.TAG}}) || true - (podman manifest exists {{.IMAGE}}:{{.TAG}} && podman manifest rm {{.IMAGE}}:{{.TAG}}) || true
- podman manifest create {{.IMAGE}}:{{.TAG}} - podman manifest create {{.IMAGE}}:{{.TAG}}
- podman build {{.CLI_ARGS}} --platform linux/amd64,linux/arm64 --manifest {{.IMAGE}}:{{.TAG}} {{.CLI_ARGS}} -f Dockerfile ctx - podman build {{.CLI_ARGS}} --platform linux/amd64,linux/arm64 --manifest {{.IMAGE}}:{{.TAG}} {{.CLI_ARGS}} -f Dockerfile ctx
- |
DIGESTS=$(podman manifest inspect {{.IMAGE}}:{{.TAG}} | jq -r '.manifests[].digest')
for DIGEST in $DIGESTS; do
echo "Annotating digest: $DIGEST"
podman manifest annotate \
--annotation org.opencontainers.image.description="A minimal image for running Linux CLI utilities" \
--annotation org.opencontainers.image.url=https://git.sr.ht/~jswank/alpine-cli \
--annotation org.opencontainers.image.title=jswank/alpine-cli \
{{.IMAGE}}:{{.TAG}} $DIGEST
done
publish: publish:
desc: publish the image desc: publish the image with the default tag, 'current', and 'latest'
cmds: cmds:
- podman tag {{.IMAGE}}:{{.TAG}} {{.REGISTRY}}/{{.IMAGE}}:{{.ALT_TAG}} - task: _publish
- task: _publish
vars:
ALT_TAG: 'latest'
_publish:
desc: publish the image
internal: true
cmds:
- podman tag {{.IMAGE}}:{{.TAG}} {{.REGISTRY}}/{{.IMAGE}}:{{default .TAG .ALT_TAG}}
- echo "${{.REGISTRY_PASS_VAR}}" | podman login {{.REGISTRY}} -u {{.REGISTRY_USER}} --password-stdin - echo "${{.REGISTRY_PASS_VAR}}" | podman login {{.REGISTRY}} -u {{.REGISTRY_USER}} --password-stdin
- podman manifest push {{.REGISTRY}}/{{.IMAGE}}:{{.ALT_TAG}} - podman manifest push {{.REGISTRY}}/{{.IMAGE}}:{{default .TAG .ALT_TAG}}
- podman logout {{.REGISTRY}} - podman logout {{.REGISTRY}}
vars: vars:
REGISTRY_PASS_VAR: GH_PAT REGISTRY_PASS_VAR: GH_PAT
REGISTRY: ghcr.io REGISTRY: ghcr.io
REGISTRY_USER: jswank REGISTRY_USER: jswank
ALT_TAG: '{{.TAG}}'

View File

@@ -0,0 +1,4 @@
# Source library files in alphabetical order
for lib in ~/.config/direnv/lib/*.sh; do
[[ -f "$lib" ]] && source "$lib"
done

View File

@@ -0,0 +1,16 @@
# Exports a Podman / Docker secret as an environment variable
export-secret() {
local name="$1"
local file="/run/secrets/${name}"
if [[ ! -f "$file" ]]; then
printf "secret file not found: %s\n" $file >&2
return 1
fi
# Read first line, remove trailing spaces/tabs, convert nulls to newlines
local value
value=$(head -n1 "$file" | sed 's/[ \t]*$//' | tr '\0' '\n')
export "${name}=${value}"
}

1
ctx/home/.npmrc Normal file
View File

@@ -0,0 +1 @@
prefix=~/.local

View File

@@ -6,3 +6,5 @@ export LESS=RX # R for ANSI color sequences, X to not clear screen on exit
export TMPDIR=/var/tmp export TMPDIR=/var/tmp
export PS1="\w $ " export PS1="\w $ "
export PATH=${PATH}:~/.local/bin export PATH=${PATH}:~/.local/bin
eval "$(direnv hook bash)"

View File

@@ -1,21 +0,0 @@
set dotenv-load
tag := `grep ^FROM Dockerfile | cut -d: -f2`
image := "jswank/alpine-cli"
registry := "ghcr.io"
registry_user := "jswank"
# this environment variable will be passed to podman login as the password
registry_pass_var := "REGISTRY_PASSWORD"
# build a new image
build flags="":
podman build -t {{image}}:{{tag}} {{flags}} -f Dockerfile ctx
# publish the image
publish alt_tag=tag:
@ podman tag {{image}}:{{tag}} {{registry}}/{{image}}:{{alt_tag}}
@ echo "${{ registry_pass_var }}" | podman login {{registry}} -u {{registry_user}} --password-stdin
@ podman push {{registry}}/{{image}}:{{alt_tag}}
@ podman logout {{registry}}