33ARG WOLFI_VERSION="latest"
44ARG CODE_SERVER_VERSION="latest"
55
6- FROM --platform=$BUILDPLATFORM cgr.dev/chainguard/wolfi-base:${WOLFI_VERSION} AS base
7-
8- ARG TARGETOS
9- ARG TARGETARCH
10- ARG TARGETVARIANT
11-
12- RUN apk add --no-cache \
13- curl \
14- gzip \
15- unzip
16-
17- FROM base AS jq
18-
19- # --- Install jq CLI
20- ARG JQ_VERSION="1.7.1"
21- ENV JQ_VERSION=$JQ_VERSION
22- RUN curl -fsL --output /usr/bin/jq \
23- https://github.com/jqlang/jq/releases/download/jq-${JQ_VERSION}/jq-${TARGETOS}-${TARGETARCH} && \
24- chmod 755 /usr/bin/jq
25-
26- USER nonroot
27-
28- FROM base AS yq
29-
30- # --- Install yq CLI
31- ARG YQ_VERSION="v4.44.1"
32- ENV YQ_VERSION=$YQ_VERSION
33- RUN curl -fsL --output /usr/bin/yq \
34- https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/yq_${TARGETOS}_${TARGETARCH} && \
35- chmod 755 /usr/bin/yq
36-
37- USER nonroot
38-
39- FROM base AS powerline-go
40-
41- # --- Install yq CLI
42- ARG POWERLINEGO_VERSION="v1.24"
43- ENV POWERLINEGO_VERSION=$POWERLINEGO_VERSION
44- RUN curl -fsL --output /usr/bin/powerline-go \
45- https://github.com/justjanne/powerline-go/releases/download/${POWERLINEGO_VERSION}/powerline-go-${TARGETOS}-${TARGETARCH} && \
46- chmod 755 /usr/bin/powerline-go
47-
48- USER nonroot
49-
50- FROM base AS kubectl
51-
52- # --- Install kubectl CLI
53- ARG KUBECTL_VERSION="v1.29.5"
54- ENV KUBECTL_VERSION=$KUBECTL_VERSION
55- RUN curl -fsSL https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/${TARGETOS}/${TARGETARCH}/kubectl \
56- -o /usr/bin/kubectl && \
57- chmod 755 /usr/bin/kubectl
58-
59- USER nonroot
60-
61- FROM base AS k9s
62-
63- # --- Install k9s CLI
64- ARG K9S_VERSION="v0.50.16"
65- ENV K9S_VERSION=$K9S_VERSION
66- RUN curl -fsSL https://github.com/derailed/k9s/releases/download/${K9S_VERSION}/k9s_Linux_${TARGETARCH}.tar.gz | \
67- tar xvzf - -C /usr/bin k9s && \
68- chmod 755 /usr/bin/k9s
69-
70- USER nonroot
71-
72- FROM base AS helm
73-
74- # --- Install helm CLI
75- ARG HELM_VERSION="v3.19.2"
76- ENV HELM_VERSION=$HELM_VERSION
77- RUN curl -fsSL https://get.helm.sh/helm-${HELM_VERSION}-${TARGETOS}-${TARGETARCH}.tar.gz | \
78- tar xvzf - --strip-components=1 -C /usr/bin ${TARGETOS}-${TARGETARCH}/helm && \
79- chmod 755 /usr/bin/helm
80-
81- USER nonroot
82-
83- FROM base AS helmfile
84-
85- # --- Install helmfile CLI
86- ARG HELMFILE_VERSION="1.2.2"
87- ENV HELMFILE_VERSION=$HELMFILE_VERSION
88- RUN curl -fsSL https://github.com/helmfile/helmfile/releases/download/v${HELMFILE_VERSION}/helmfile_${HELMFILE_VERSION}_${TARGETOS}_${TARGETARCH}.tar.gz | \
89- tar xvzf - -C /usr/bin helmfile && \
90- chmod 755 /usr/bin/helmfile
91-
92- USER nonroot
93-
94- FROM base AS grype
95-
96- # --- Install grype CLI
97- ARG GRYPE_VERSION="0.104.1"
98- ENV GRYPE_VERSION=$GRYPE_VERSION
99- RUN curl -fsSL https://github.com/anchore/grype/releases/download/v${GRYPE_VERSION}/grype_${GRYPE_VERSION}_${TARGETOS}_${TARGETARCH}.tar.gz | \
100- tar xvzf - -C /usr/bin grype && \
101- chmod 755 /usr/bin/grype
102-
103- USER nonroot
104-
105- FROM base AS cosign
106-
107- # --- Install cosign CLI
108- ARG COSIGN_VERSION="3.0.2"
109- ENV COSIGN_VERSION=$COSIGN_VERSION
110- RUN curl -fsSL https://github.com/sigstore/cosign/releases/download/v${COSIGN_VERSION}/cosign-${TARGETOS}-${TARGETARCH} \
111- -o /usr/bin/cosign && \
112- chmod 755 /usr/bin/cosign
113-
114- USER nonroot
115-
116- FROM base AS terraform
117-
118- # --- Install terraform CLI
119- ARG TERRAFORM_VERSION="1.14.1"
120- ENV TERRAFORM_VERSION=$TERRAFORM_VERSION
121- RUN TEMP_DIR=$(mktemp -d) && \
122- curl -fsSL https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_${TARGETOS}_${TARGETARCH}.zip \
123- -o ${TEMP_DIR}/terraform.zip && \
124- unzip -d $TEMP_DIR ${TEMP_DIR}/terraform.zip && \
125- mv ${TEMP_DIR}/terraform /usr/bin/terraform && \
126- chmod 755 /usr/bin/terraform && \
127- rm -rf ${TEMP_DIR}
128-
129- USER nonroot
130-
131- FROM base AS tofu
132-
133- # --- Install tofu CLI
134- ARG TOFU_VERSION="1.10.8"
135- ENV TOFU_VERSION=$TOFU_VERSION
136- RUN curl -fsSL https://github.com/opentofu/opentofu/releases/download/v${TOFU_VERSION}/tofu_${TOFU_VERSION}_${TARGETOS}_${TARGETARCH}.tar.gz | \
137- tar xvzf - -C /usr/bin tofu && \
138- chmod 755 /usr/bin/tofu
139-
140- USER nonroot
141-
142- FROM base AS terragrunt
143-
144- # --- Install terragrunt CLI
145- ARG TERRAGRUNT_VERSION="0.94.0"
146- ENV TERRAGRUNT_VERSION=$TERRAGRUNT_VERSION
147- RUN curl -fsSL https://github.com/gruntwork-io/terragrunt/releases/download/v${TERRAGRUNT_VERSION}/terragrunt_${TARGETOS}_${TARGETARCH} \
148- -o /usr/bin/terragrunt && \
149- chmod 755 /usr/bin/terragrunt
150-
151- USER nonroot
152-
153- FROM base AS vault
154-
155- # --- Install vault CLI
156- ARG VAULT_VERSION="1.21.1"
157- ENV VAULT_VERSION=$VAULT_VERSION
158- RUN TEMP_DIR=$(mktemp -d) && \
159- curl -fsSL https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_${TARGETOS}_${TARGETARCH}.zip \
160- -o ${TEMP_DIR}/vault.zip && \
161- unzip -d $TEMP_DIR ${TEMP_DIR}/vault.zip && \
162- mv ${TEMP_DIR}/vault /usr/bin/vault && \
163- chmod 755 /usr/bin/vault && \
164- rm -rf ${TEMP_DIR}
165-
166- USER nonroot
167-
168- FROM base AS dagger
169-
170- # --- Install dagger CLI
171- ARG DAGGER_VERSION="0.19.8"
172- ENV DAGGER_VERSION=$DAGGER_VERSION
173- RUN curl -fsSL https://github.com/dagger/dagger/releases/download/v${DAGGER_VERSION}/dagger_v${DAGGER_VERSION}_${TARGETOS}_${TARGETARCH}.tar.gz | \
174- tar xvzf - -C /usr/bin dagger && \
175- chmod 755 /usr/bin/dagger
176-
177- USER nonroot
6+ ARG MISE_VERSION="2025.12.0"
7+ FROM jdxcode/mise:${MISE_VERSION} AS mise
1788
1799FROM lscr.io/linuxserver/code-server:${CODE_SERVER_VERSION} AS prod
18010
@@ -188,7 +18,6 @@ LABEL org.opencontainers.image.source="https://github.com/opopops/docker/tree/ma
18818LABEL org.opencontainers.image.description="Code-Server image"
18919
19020ENV DEBIAN_FRONTEND="noninteractive"
191- RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache
19221RUN --mount=type=cache,id=apt-cache-${TARGETARCH}${TARGETVARIANT},target=/var/cache/apt,sharing=locked \
19322 --mount=type=cache,id=apt-${TARGETARCH}${TARGETVARIANT},target=/var/lib/apt,sharing=locked \
19423 apt-get update && \
@@ -204,63 +33,27 @@ RUN --mount=type=cache,id=apt-cache-${TARGETARCH}${TARGETVARIANT},target=/var/ca
20433 nano \
20534 openssh-client \
20635 pigz \
207- pipx \
208- python3-pip \
209- python3-venv \
21036 rsync \
21137 unzip \
21238 vim
21339
214- ENV EDITOR=vi
215- ENV PATH="${PATH}:/config/.local/bin"
216-
217- # --- Install docker
218- ARG DOCKER_VERSION="29.1.2"
219- ENV DOCKER_VERSION=$DOCKER_VERSION
220- RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
221- echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
222- $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
223-
224- # Pin docker version
225- # https://docs.docker.com/engine/release-notes/23.0/
226- RUN cat <<EOF > /etc/apt/preferences.d/docker
227- Package: /docker-ce/
228- Pin: version 5:${DOCKER_VERSION}*
229- Pin-Priority: 1000
230- EOF
231-
232- RUN --mount=type=cache,id=apt-cache-${TARGETARCH}${TARGETVARIANT},target=/var/cache/apt,sharing=locked \
233- --mount=type=cache,id=apt-${TARGETARCH}${TARGETVARIANT},target=/var/lib/apt,sharing=locked \
234- apt-get update && \
235- apt-get install --yes --no-install-recommends \
236- docker-buildx-plugin \
237- docker-compose-plugin \
238- docker-ce-cli
40+ # --- Install mise
41+ ENV MISE_CACHE_DIR=/mise/cache \
42+ MISE_CONFIG_DIR=/mise \
43+ MISE_DATA_DIR=/mise
23944
240- RUN groupadd -g 996 docker && \
241- usermod -a -G docker abc
45+ RUN mkdir -p \
46+ $MISE_CONFIG_DIR \
47+ $MISE_CACHE_DIR \
48+ $MISE_DATA_DIR
24249
243- # --- Install python packages
244- RUN --mount=type=cache,target=/config/.cache/pip \
245- pipx install ansible-lint && \
246- pipx install pylint && \
247- pipx install pytest && \
248- pipx install ruff && \
249- pipx install uv
50+ COPY --link --from=mise /usr/local/bin/mise /usr/local/bin/mise
51+ COPY ./mise.toml ${MISE_CONFIG_DIR}/mise.toml
52+ RUN --mount=type=cache,id=mise-cache,target=${MISE_CACHE_DIR} \
53+ --mount=type=secret,id=github_token,env=GITHUB_TOKEN \
54+ mise upgrade
25055
251- # --- Install binaries
252- COPY --link --from=cosign /usr/bin/cosign /usr/local/bin/cosign
253- COPY --link --from=dagger /usr/bin/dagger /usr/local/bin/dagger
254- COPY --link --from=grype /usr/bin/grype /usr/local/bin/grype
255- COPY --link --from=helm /usr/bin/helm /usr/local/bin/helm
256- COPY --link --from=helmfile /usr/bin/helmfile /usr/local/bin/helmfile
257- COPY --link --from=jq /usr/bin/jq /usr/local/bin/jq
258- COPY --link --from=k9s /usr/bin/k9s /usr/local/bin/k9s
259- COPY --link --from=kubectl /usr/bin/kubectl /usr/local/bin/kubectl
260- COPY --link --from=powerline-go /usr/bin/powerline-go /usr/local/bin/powerline-go
261- COPY --link --from=tofu /usr/bin/tofu /usr/bin/local/tofu
262- COPY --link --from=vault /usr/bin/vault /usr/local/bin/vault
263- COPY --link --from=yq /usr/bin/yq /usr/bin/local/yq
56+ ENV EDITOR=vi
26457
26558# --- Update bashrc
26659RUN cat <<EOF >> /config/.bashrc
@@ -280,11 +73,15 @@ alias kwolfi="kubectl run shell --rm -i --tty --image-pull-policy='Always' --ima
28073alias terraform='tofu'
28174alias tf='tofu'
28275
76+ # MISE
77+ eval "$(mise activate bash)"
78+
79+ # POWERLINE-GO
28380function _update_ps1() {
284- PS1="\$ (/usr/bin/ powerline-go -mode flat -hostname-only-if-ssh -cwd-max-depth 3 -modules cwd,git,terraform-workspace,kube -error \$ ? -jobs \$ (jobs -p | wc -l))"
81+ PS1="\$ (powerline-go -mode flat -hostname-only-if-ssh -cwd-max-depth 3 -modules cwd,git,terraform-workspace,kube -error \$ ? -jobs \$ (jobs -p | wc -l))"
28582}
28683
287- if [ "\$ TERM" != "linux" ] && [ -f "/usr/bin/powerline-go" ] ; then
84+ if [ "\$ TERM" != "linux" ]; then
28885 PROMPT_COMMAND="_update_ps1; \$ PROMPT_COMMAND"
28986fi
29087EOF
0 commit comments