From d0dd759983a24f7009c4c0e1522c09f8bef53dd4 Mon Sep 17 00:00:00 2001 From: Bret Fisher Date: Mon, 26 Apr 2021 14:09:14 -0500 Subject: [PATCH 1/3] support arm64 and mostly arm/v7 --- Dockerfile | 220 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 157 insertions(+), 63 deletions(-) diff --git a/Dockerfile b/Dockerfile index 69f89b2..02a6844 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,79 +1,174 @@ -FROM golang:alpine AS jid +FROM --platform=${BUILDPLATFORM} golang:alpine AS jid RUN apk add git +# build jid for later RUN go get -u github.com/simeji/jid/cmd/jid -FROM alpine + +# main image with all the tools +FROM --platform=${BUILDPLATFORM} alpine +ARG TARGETPLATFORM ENV \ - COMPOSE_VERSION=1.26.2 \ - HELM_VERSION=3.3.0 \ - KUBECTL_VERSION=1.18.8 \ + COMPOSE_VERSION=1.28.6 \ + HELM_VERSION=3.5.3 \ + KUBECTL_VERSION=1.20.0 \ + KUBECTX_VERSION=0.9.3 \ SHIP_VERSION=0.51.3 \ - STERN_VERSION=1.11.0 -## which platform ## -RUN uname -s && uname -m -## Alpine base ## + STERN_VERSION=1.14.0 ENV COMPLETIONS=/usr/share/bash-completion/completions RUN apk add bash bash-completion curl git jq libintl ncurses openssl tmux vim apache2-utils -RUN sed -i s,/bin/ash,/bin/bash, /etc/passwd -## Ubuntu base ## -#ENV COMPLETIONS=/etc/bash_completion.d -#RUN apt-get update \ -# && apt-get install -y curl git jq vim apache2-utils -## Install a bunch of binaries -RUN curl -L -o /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-Linux-x86_64 \ - && chmod +x /usr/local/bin/docker-compose -RUN curl -L -o /usr/local/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/linux/amd64/kubectl \ - && chmod +x /usr/local/bin/kubectl + +# docker-compose +# FIXME: sadly only x64 builds are prebuilt +# arm versions are usable with pip, but this image doesn't have Python (for size mostly) +# the future is "compose-cli" so the TODO here is to just add that instead +# TODO: add compose-cli +RUN echo compose; \ + if [[ ${TARGETPLATFORM} == "linux/amd64" ]] ; then \ + (curl -sSLo /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-Linux-x86_64 \ + && chmod +x /usr/local/bin/docker-compose) \ + fi + +# TODO: add docker cli + +# kubectl https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/ +RUN echo kubectl; \ + case ${TARGETPLATFORM} in \ + "linux/amd64") ARCH=amd64 ;; \ + "linux/arm64") ARCH=arm64 ;; \ + "linux/arm/v7") ARCH=arm ;; \ + esac \ + && curl -sSLo /usr/local/bin/kubectl https://dl.k8s.io/release/v${KUBECTL_VERSION}/bin/linux/${ARCH}/kubectl \ + && chmod +x /usr/local/bin/kubectl RUN kubectl completion bash > $COMPLETIONS/kubectl.bash -RUN curl -L -o /usr/local/bin/stern https://github.com/wercker/stern/releases/download/${STERN_VERSION}/stern_linux_amd64 \ - && chmod +x /usr/local/bin/stern -RUN stern --completion bash > $COMPLETIONS/stern.bash -RUN curl -L https://get.helm.sh/helm-v${HELM_VERSION}-linux-amd64.tar.gz \ - | tar zx -C /usr/local/bin --strip-components=1 linux-amd64/helm -RUN helm completion bash > $COMPLETIONS/helm.bash -RUN curl -L https://github.com/replicatedhq/ship/releases/download/v${SHIP_VERSION}/ship_${SHIP_VERSION}_linux_amd64.tar.gz \ - | tar zx -C /usr/local/bin ship -# This is embarrassing, but I can't get httping to compile correctly with musl. -# It reports negative times. So, I found this random binary here. Shrug. -RUN curl -L https://github.com/static-linux/static-binaries-i386/raw/4266c69990ae11315bad7b928f85b6c8e605ef14/httping-2.4.tar.gz \ - | tar zx -C /usr/local/bin --strip-components=1 httping-2.4/httping -RUN cd /tmp \ - && git clone https://github.com/ahmetb/kubectx \ - && cd kubectx \ - && mv kubectx /usr/local/bin/kctx \ - && mv kubens /usr/local/bin/kns \ - && mv completion/*.bash $COMPLETIONS \ - && cd .. \ - && rm -rf kubectx -RUN cd /tmp \ - && git clone https://github.com/jonmosco/kube-ps1 \ - && cp kube-ps1/kube-ps1.sh /etc/profile.d/ \ - && rm -rf kube-ps1 -RUN mkdir /tmp/krew \ - && cd /tmp/krew \ - && curl -fsSL https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.tar.gz | tar -zxf- \ - && ./krew-linux_amd64 install krew \ - && cd \ - && rm -rf /tmp/krew \ - && echo export 'PATH=$HOME/.krew/bin:$PATH' >> .bashrc -RUN curl -sSL https://github.com/derailed/k9s/releases/latest/download/k9s_$(uname -s)_$(uname -m).tar.gz \ - | tar -zxvf- -C /usr/local/bin k9s -RUN curl -sSL https://github.com/derailed/popeye/releases/latest/download/popeye_$(uname -s)_$(uname -m).tar.gz \ - | tar -zxvf- -C /usr/local/bin popeye -COPY --from=tiltdev/tilt /usr/local/bin/tilt /usr/local/bin/tilt -RUN curl -Lo /usr/local/bin/skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64 \ - && chmod +x /usr/local/bin/skaffold -RUN curl -Lo /usr/local/bin/kompose https://github.com/kubernetes/kompose/releases/latest/download/kompose-linux-amd64 \ - && chmod +x /usr/local/bin/kompose -RUN curl -Lo /usr/local/bin/kubeseal https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.13.1/kubeseal-linux-amd64 \ - && chmod +x /usr/local/bin/kubeseal RUN kubectl config set-context kubernetes --namespace=default \ - && kubectl config use-context kubernetes + && kubectl config use-context kubernetes + +# stern https://github.com/stern/stern +RUN echo stern; case ${TARGETPLATFORM} in \ + "linux/amd64") ARCH=amd64 ;; \ + "linux/arm64") ARCH=arm64 ;; \ + "linux/arm/v7") ARCH=arm ;; \ + esac \ + && curl -sSL https://github.com/stern/stern/releases/download/v${STERN_VERSION}/stern_${STERN_VERSION}_linux_${ARCH}.tar.gz \ + | tar -zxo -C /usr/local/bin/ --strip-components=1 stern_${STERN_VERSION}_linux_${ARCH}/stern +RUN stern --completion bash > $COMPLETIONS/stern.bash + +# helm https://github.com/helm/helm +RUN echo helm; case ${TARGETPLATFORM} in \ + "linux/amd64") ARCH=amd64 ;; \ + "linux/arm64") ARCH=arm64 ;; \ + "linux/arm/v7") ARCH=arm ;; \ + esac \ + && curl -sSL https://get.helm.sh/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz \ + | tar zxo -C /usr/local/bin --strip-components=1 linux-${ARCH}/helm +RUN helm completion bash > $COMPLETIONS/helm.bash + +# httping https://github.com/BretFisher/httping-docker +COPY --from=bretfisher/httping /usr/local/bin/httping /usr/local/bin/httping + +# kubectx and kubens https://github.com/ahmetb/kubectx +RUN #kubectx; case ${TARGETPLATFORM} in \ + "linux/amd64") ARCH=x86_64 ;; \ + "linux/arm64") ARCH=arm64 ;; \ + "linux/arm/v7") ARCH=armhf ;; \ + esac \ + && curl -sSL https://github.com/ahmetb/kubectx/releases/download/v${KUBECTX_VERSION}/kubectx_v${KUBECTX_VERSION}_linux_${ARCH}.tar.gz \ + | tar -zxo -C /usr/local/bin/ kubectx \ + && curl -sSL https://github.com/ahmetb/kubectx/releases/download/v${KUBECTX_VERSION}/kubens_v${KUBECTX_VERSION}_linux_${ARCH}.tar.gz \ + | tar -zxo -C /usr/local/bin/ kubens \ + && curl -sSLo ${COMPLETIONS}/kubectx.bash https://github.com/ahmetb/kubectx/releases/download/v${KUBECTX_VERSION}/kubectx \ + && curl -sSLo ${COMPLETIONS}/kubens.bash https://github.com/ahmetb/kubectx/releases/download/v${KUBECTX_VERSION}/kubens + +# kube-ps1 https://github.com/jonmosco/kube-ps1 +RUN #kube-ps1; curl -sSLo /etc/profile.d/kube-ps1.sh https://raw.githubusercontent.com/jonmosco/kube-ps1/master/kube-ps1.sh + +# krew https://github.com/kubernetes-sigs/krew +RUN #krew; case ${TARGETPLATFORM} in \ + "linux/amd64") ARCH=amd64 ;; \ + "linux/arm64") ARCH=arm64 ;; \ + "linux/arm/v7") ARCH=arm ;; \ + esac \ + && mkdir /tmp/krew \ + && cd /tmp/krew \ + && curl -sSL https://github.com/kubernetes-sigs/krew/releases/latest/download/krew.tar.gz \ + | tar -zxf- \ + && ./krew-linux_${ARCH} install krew \ + && cd \ + && rm -rf /tmp/krew \ + && echo export 'PATH=$HOME/.krew/bin:$PATH' >> .bashrc + +# TODO: add ship +# TODO: add https://github.com/replicatedhq/kots + +# k9s https://github.com/derailed/k9s +RUN #k9s; case ${TARGETPLATFORM} in \ + "linux/amd64") ARCH=x86_64 ;; \ + "linux/arm64") ARCH=arm64 ;; \ + "linux/arm/v7") ARCH=arm ;; \ + esac \ + && curl -sSL https://github.com/derailed/k9s/releases/latest/download/k9s_Linux_${ARCH}.tar.gz \ + | tar -zxo -C /usr/local/bin/ k9s + +# popeye https://github.com/derailed/popeye +RUN #popeye; case ${TARGETPLATFORM} in \ + "linux/amd64") ARCH=x86_64 ;; \ + "linux/arm64") ARCH=arm64 ;; \ + "linux/arm/v7") ARCH=arm ;; \ + esac \ + && curl -sSL https://github.com/derailed/popeye/releases/latest/download/popeye_Linux_${ARCH}.tar.gz \ + | tar -zxo -C /usr/local/bin popeye + +# tilt https://github.com/tilt-dev/tilt +RUN #tilt; case ${TARGETPLATFORM} in \ + "linux/amd64") ARCH=x86_64 ;; \ + "linux/arm64") ARCH=arm64_ALPHA ;; \ + "linux/arm/v7") ARCH=arm_ALPHA ;; \ + esac \ + && curl -sSL https://github.com/tilt-dev/tilt/releases/download/v0.19.0/tilt.0.19.0.linux.${ARCH}.tar.gz \ + | tar -zxo -C /usr/local/bin tilt + +# skaffold https://skaffold.dev +# FIXME: wait for arm/v7 support and update + # "linux/arm/v7") ARCH=arm ;; \ + # https://github.com/GoogleContainerTools/skaffold/issues/5610 +RUN #skaffold; case ${TARGETPLATFORM} in \ + "linux/amd64") ARCH=amd64 ;; \ + "linux/arm64") ARCH=arm64 ;; \ + ac \ + && if [[ ${ARCH} != "arm" ]] ; \ + then \ + curl -sSLo /usr/local/bin/skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-${ARCH} \ + && chmod +x /usr/local/bin/skaffold ; \ + fi + +# kompose https://github.com/kubernetes/kompose +RUN #kompose; case ${TARGETPLATFORM} in \ + "linux/amd64") ARCH=amd64 ;; \ + "linux/arm64") ARCH=arm64 ;; \ + "linux/arm/v7") ARCH=arm ;; \ + esac \ + && curl -sSLo /usr/local/bin/kompose https://github.com/kubernetes/kompose/releases/latest/download/kompose-linux-${ARCH} \ + && chmod +x /usr/local/bin/kompose + +#kubeseal https://github.com/bitnami-labs/sealed-secrets +RUN #kubeseal; case ${TARGETPLATFORM} in \ + "linux/amd64") ARCH=linux-amd64 ;; \ + "linux/arm64") ARCH=arm64 ;; \ + "linux/arm/v7") ARCH=arm ;; \ + esac \ + && curl -sSLo /usr/local/bin/kubeseal https://github.com/bitnami-labs/sealed-secrets/releases/download/latest/kubeseal-${ARCH} \ + && chmod +x /usr/local/bin/kubeseal + +# jid https://github.com/simeji/jid COPY --from=jid /go/bin/jid /usr/local/bin/jid + +# final shell environment prep WORKDIR /root RUN echo trap exit TERM > /etc/profile.d/trapterm.sh RUN sed -i "s/export PS1=/#export PS1=/" /etc/profile +RUN sed -i s,/bin/ash,/bin/bash, /etc/passwd ENV \ HOSTIP="0.0.0.0" \ + TERM="xterm-256color" \ KUBE_PS1_PREFIX="" \ KUBE_PS1_SUFFIX="" \ KUBE_PS1_SYMBOL_ENABLE="false" \ @@ -81,4 +176,3 @@ ENV \ KUBE_PS1_NS_COLOR="green" \ PS1="\e[1m\e[31m[\$HOSTIP] \e[32m(\$(kube_ps1)) \e[34m\u@\h\e[35m \w\e[0m\n$ " ENTRYPOINT ["bash", "-l"] - From f715e360e4dd4f6f36dcaa84e933471823582f13 Mon Sep 17 00:00:00 2001 From: Bret Fisher Date: Mon, 26 Apr 2021 14:20:15 -0500 Subject: [PATCH 2/3] adding GHCR and arm/v7 builds --- .github/workflows/docker-build-and-push.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/docker-build-and-push.yml b/.github/workflows/docker-build-and-push.yml index 5cc50b2..a736754 100644 --- a/.github/workflows/docker-build-and-push.yml +++ b/.github/workflows/docker-build-and-push.yml @@ -21,7 +21,7 @@ jobs: # list of Docker images to use as base name for tags images: | bretfisher/shpod - # ghcr.io/bretfisher/shpod + ghcr.io/bretfisher/shpod # add git short SHA as Docker tag tag-sha: true - @@ -38,18 +38,18 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - # name: Login to GHCR - # if: github.event_name != 'pull_request' - # uses: docker/login-action@v1 - # with: - # registry: ghcr.io - # username: ${{ secrets.GHCR_USERNAME }} - # password: ${{ secrets.GHCR_TOKEN }} - # - + name: Login to GHCR + if: github.event_name != 'pull_request' + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push uses: docker/build-push-action@v2 with: - platforms: linux/amd64,linux/arm64 + platforms: linux/amd64,linux/arm64,linux/arm/v7 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.docker_meta.outputs.tags }},bretfisher/shpod:latest labels: ${{ steps.docker_meta.outputs.labels }} \ No newline at end of file From 8140621ab39a2cbfc691cea78b95e8d247071fd3 Mon Sep 17 00:00:00 2001 From: Bret Fisher Date: Mon, 26 Apr 2021 14:27:39 -0500 Subject: [PATCH 3/3] add PR support to builds --- .github/workflows/docker-build-and-push.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker-build-and-push.yml b/.github/workflows/docker-build-and-push.yml index a736754..e18e5d5 100644 --- a/.github/workflows/docker-build-and-push.yml +++ b/.github/workflows/docker-build-and-push.yml @@ -1,13 +1,16 @@ name: shpod on: + pull_request: + branches: + - 'mastery' push: branches: - 'mastery' jobs: - dockerize: + build-and-push-images: runs-on: ubuntu-latest steps: - @@ -22,8 +25,6 @@ jobs: images: | bretfisher/shpod ghcr.io/bretfisher/shpod - # add git short SHA as Docker tag - tag-sha: true - name: Set up QEMU uses: docker/setup-qemu-action@v1 @@ -51,5 +52,5 @@ jobs: with: platforms: linux/amd64,linux/arm64,linux/arm/v7 push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.docker_meta.outputs.tags }},bretfisher/shpod:latest + tags: ${{ steps.docker_meta.outputs.tags }} labels: ${{ steps.docker_meta.outputs.labels }} \ No newline at end of file