diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c63ca5f..02484b0 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,6 +7,11 @@ updates: interval: weekly - package-ecosystem: docker - directory: / + directory: /alpine/ + schedule: + interval: weekly + + - package-ecosystem: docker + directory: /debian schedule: interval: weekly diff --git a/.github/workflows/anchore-analysis.yml b/.github/workflows/anchore-analysis.yml index 7b741fa..cf2a7e5 100644 --- a/.github/workflows/anchore-analysis.yml +++ b/.github/workflows/anchore-analysis.yml @@ -14,6 +14,11 @@ on: jobs: anchore-analysis: runs-on: ubuntu-latest + strategy: + matrix: + variant: + - alpine + - debian steps: - name: Checkout source code uses: actions/checkout@v2.3.4 @@ -22,6 +27,7 @@ jobs: - name: Build the Docker image uses: docker/build-push-action@v2.2.0 with: + context: ${{ matrix.variant }} push: false tags: ${{ env.DOCKER_IMAGE_NAME }}:latest - name: Perform Anchore analysis diff --git a/.github/workflows/build-publish.yml b/.github/workflows/build-publish.yml index 458d386..46539f0 100644 --- a/.github/workflows/build-publish.yml +++ b/.github/workflows/build-publish.yml @@ -11,6 +11,15 @@ on: jobs: build-publish: runs-on: ubuntu-latest + strategy: + matrix: + include: + - variant: alpine + tagLatest: alpine + tagSuffix: alpine + - variant: debian + tagLatest: latest + tagSuffix: "" steps: - name: Checkout source code uses: actions/checkout@v2.3.4 @@ -23,9 +32,10 @@ jobs: password: ${{ secrets.DOCKER_HUB_PASSWORD }} - name: Get release version id: get_release_version - run: echo ::set-output name=tags::${GITHUB_REF#refs/*/v} + run: echo ::set-output name=tag::${GITHUB_REF#refs/*/v} - name: Build and Push the Docker image uses: docker/build-push-action@v2.2.0 with: + context: ${{ matrix.variant }} push: true - tags: ${{ env.DOCKER_IMAGE_NAME }}:${{ steps.get_release_version.outputs.tags }},${{ env.DOCKER_IMAGE_NAME }}:latest + tags: ${{ env.DOCKER_IMAGE_NAME }}:${{ steps.get_release_version.outputs.tag }}${{ matrix.tagSuffix }},${{ env.DOCKER_IMAGE_NAME }}:${{ matrix.tagLatest }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ddee82e..369eb2a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,6 +11,11 @@ on: jobs: build: runs-on: ubuntu-latest + strategy: + matrix: + variant: + - alpine + - debian steps: - name: Checkout source code uses: actions/checkout@v2.3.4 @@ -19,4 +24,5 @@ jobs: - name: Build the Docker image uses: docker/build-push-action@v2.2.0 with: + context: ${{ matrix.variant }} push: false diff --git a/.github/workflows/dive-analysis.yml b/.github/workflows/dive-analysis.yml index bfff420..a4da502 100644 --- a/.github/workflows/dive-analysis.yml +++ b/.github/workflows/dive-analysis.yml @@ -14,6 +14,11 @@ on: jobs: dive-analysis: runs-on: ubuntu-latest + strategy: + matrix: + variant: + - alpine + - debian steps: - name: Checkout source code uses: actions/checkout@v2.3.4 @@ -22,6 +27,7 @@ jobs: - name: Build the Docker image uses: docker/build-push-action@v2.2.0 with: + context: ${{ matrix.variant }} load: true push: false tags: ${{ env.DOCKER_IMAGE_NAME }}:latest diff --git a/README.md b/README.md index 2327772..a042e2f 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,35 @@ # Visual Studio Code Development Container -`paniclobster/devcontainer-base` is an alpine-based image with a -configurable setup for different development workspaces needs. +`paniclobster/devcontainer-base` is a Docker image built upon both Alpine and +Debian with a configurable setup for different development workspaces needs. [![build](https://github.com/paniclobster/devcontainer-base/workflows/build/badge.svg)](https://github.com/paniclobster/devcontainer-base/actions/) [![license](https://img.shields.io/github/license/paniclobster/devcontainer-base)](https://github.com/paniclobster/devcontainer-base/blob/main/LICENSE.md) [![docker hub](https://img.shields.io/docker/v/paniclobster/devcontainer-base?sort=semver)](https://hub.docker.com/r/paniclobster/devcontainer-base) [![contributor covenant](https://img.shields.io/badge/contributor%20covenant-v2.0%20adopted-ff69b4.svg)](https://github.com/paniclobster/devcontainer-base/blob/main/CODE_OF_CONDUCT.md) -## Available Setups +## Alpine Available Setups - Alpine SDK (alpine-sdk) - Dapr CLI (dapr-cli) - Ghostscript (ghostscript) - Go (go, go-tools) -- Helm (helm) - ImageMagick (imagemagick) -- Kubectl (kubernetes) -- Kustomize (kustomize) -- Minikube (minikube) +- Kubernetes (kubernetes, helm, kustomize, minikube, kind, skaffold) +- Node.js (node) +- Python 2 (python2) +- Python 3 (python3) + +## Debian Available Setups + +- Dapr CLI (dapr-cli) +- Ghostscript (ghostscript) +- Go (go, go-tools) +- ImageMagick (imagemagick) +- Kubernetes (kubernetes, helm, kustomize, minikube, kind, skaffold) - Node.js (node) -- kind (kind) - Python 2 (python2) - Python 3 (python3) -- Skaffold (skaffold) ## Contributing diff --git a/Dockerfile b/alpine/Dockerfile similarity index 100% rename from Dockerfile rename to alpine/Dockerfile diff --git a/scripts/devcontainer-setup.sh b/alpine/scripts/devcontainer-setup.sh similarity index 100% rename from scripts/devcontainer-setup.sh rename to alpine/scripts/devcontainer-setup.sh diff --git a/setup/setup-alpine-sdk.sh b/alpine/setup/setup-alpine-sdk.sh similarity index 100% rename from setup/setup-alpine-sdk.sh rename to alpine/setup/setup-alpine-sdk.sh diff --git a/setup/setup-dapr-cli.sh b/alpine/setup/setup-dapr-cli.sh similarity index 100% rename from setup/setup-dapr-cli.sh rename to alpine/setup/setup-dapr-cli.sh diff --git a/setup/setup-docker.sh b/alpine/setup/setup-docker.sh similarity index 99% rename from setup/setup-docker.sh rename to alpine/setup/setup-docker.sh index 2cda5ba..94c42fb 100644 --- a/setup/setup-docker.sh +++ b/alpine/setup/setup-docker.sh @@ -16,7 +16,7 @@ DOCKER_HOST_SOCKET="/var/run/docker-host.sock" DOCKER_SOCKET="/var/run/docker.sock" sudo tee "${DEVCONTAINER_SETUP_DIR}/setup-docker-init.sh" >>/dev/null \ - </etc/sudoers.d/$DEVCONTAINER_USERNAME \ + && chmod 0440 /etc/sudoers.d/$DEVCONTAINER_USERNAME + +# Setup setup directory +ARG DEVCONTAINER_SETUP_DIR=/devcontainer/setup +ENV DEVCONTAINER_SETUP_DIR $DEVCONTAINER_SETUP_DIR +RUN mkdir -p \ + $DEVCONTAINER_SETUP_DIR +COPY ./setup/*.sh $DEVCONTAINER_SETUP_DIR/ +RUN chmod +x $DEVCONTAINER_SETUP_DIR/*.sh + +# Add setup runner script +COPY ./scripts/devcontainer-setup.sh /usr/local/bin/devcontainer-setup +RUN chmod +x /usr/local/bin/devcontainer-setup + +# Set user and workdir +USER $DEVCONTAINER_USERNAME +WORKDIR /home/$DEVCONTAINER_USERNAME diff --git a/debian/scripts/devcontainer-setup.sh b/debian/scripts/devcontainer-setup.sh new file mode 100644 index 0000000..847ed16 --- /dev/null +++ b/debian/scripts/devcontainer-setup.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -e + +if [ ! -f "${DEVCONTAINER_SETUP_DIR}/setup-${1}.log" ]; then + exec "${DEVCONTAINER_SETUP_DIR}/setup-${1}.sh" ${@:2} 2>&1 | sudo tee "${DEVCONTAINER_SETUP_DIR}/setup-${1}.log" +fi diff --git a/debian/setup/setup-dapr-cli.sh b/debian/setup/setup-dapr-cli.sh new file mode 100755 index 0000000..8cf0fc7 --- /dev/null +++ b/debian/setup/setup-dapr-cli.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -e + +# Install Dapr CLI +DAPR_CLI_INSTALL_VERSION=${DAPR_CLI_VERSION:-master} +curl --location --silent "https://raw.githubusercontent.com/dapr/cli/${DAPR_CLI_INSTALL_VERSION}/install/install.sh" | sudo bash - diff --git a/debian/setup/setup-docker.sh b/debian/setup/setup-docker.sh new file mode 100755 index 0000000..f537685 --- /dev/null +++ b/debian/setup/setup-docker.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +set -e + +# Install docker +curl --location --silent "https://get.docker.com" | sudo bash - + +# Install socat +sudo apt-get update \ + && sudo apt-get install --assume-yes \ + procps \ + socat \ + && sudo rm -rf /var/lib/apt/lists/* + +# Grant docker access to user +sudo usermod --append --groups docker $DEVCONTAINER_USERNAME + +# Configure docker socket +DOCKER_HOST_SOCKET="/var/run/docker-host.sock" +DOCKER_SOCKET="/var/run/docker.sock" + +sudo tee "${DEVCONTAINER_SETUP_DIR}/setup-docker-init.sh" >>/dev/null \ + < /dev/null; then + (sudo socat UNIX-LISTEN:${DOCKER_SOCKET},fork,mode=660,user=${DEVCONTAINER_USERNAME} UNIX-CONNECT:${DOCKER_HOST_SOCKET} 2>&1 | sudo tee -a \${SOCAT_LOG} > /dev/null & echo "\$!" | sudo tee \${SOCAT_PID} > /dev/null) +fi +EOF + +sudo chmod +x "${DEVCONTAINER_SETUP_DIR}/setup-docker-init.sh" +sudo chown ${DEVCONTAINER_USERNAME}:root "${DEVCONTAINER_SETUP_DIR}/setup-docker-init.sh" + +echo "${DEVCONTAINER_SETUP_DIR}/setup-docker-init.sh" | sudo tee -a /root/.bashrc >>/home/${DEVCONTAINER_USERNAME}/.bashrc +chown ${DEVCONTAINER_USERNAME} /home/${DEVCONTAINER_USERNAME}/.bashrc diff --git a/debian/setup/setup-ghostscript.sh b/debian/setup/setup-ghostscript.sh new file mode 100755 index 0000000..e8d09e7 --- /dev/null +++ b/debian/setup/setup-ghostscript.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -e + +# Install Ghostscript +sudo apt-get update \ + && sudo apt-get install --assume-yes \ + ghostscript \ + && sudo rm -rf /var/lib/apt/lists/* diff --git a/debian/setup/setup-go-tools.sh b/debian/setup/setup-go-tools.sh new file mode 100755 index 0000000..cca7dca --- /dev/null +++ b/debian/setup/setup-go-tools.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +set -e + +# Install Go tools +export GOPATH=${DOCKER_GO_PATH} +go get -x -d github.com/stamblerre/gocode +go build -o gocode-gomod github.com/stamblerre/gocode +mv gocode-gomod "${GOPATH}/bin/" +go get -u -v \ + github.com/acroca/go-symbols \ + github.com/cweill/gotests/... \ + github.com/davidrjenni/reftools/cmd/fillstruct \ + github.com/fatih/gomodifytags \ + github.com/go-delve/delve/cmd/dlv \ + github.com/godoctor/godoctor \ + github.com/haya14busa/goplay/cmd/goplay \ + github.com/josharian/impl \ + github.com/mdempsky/gocode \ + github.com/ramya-rao-a/go-outline \ + github.com/rogpeppe/godef \ + github.com/sqs/goreturns \ + github.com/stamblerre/gocode \ + github.com/uudashr/gopkgs/v2/cmd/gopkgs \ + github.com/uudashr/gopkgs/v2/cmd/gopkgs \ + golang.org/x/lint/golint \ + golang.org/x/tools/cmd/goimports \ + golang.org/x/tools/cmd/gorename \ + golang.org/x/tools/cmd/guru diff --git a/debian/setup/setup-go.sh b/debian/setup/setup-go.sh new file mode 100755 index 0000000..2df4f01 --- /dev/null +++ b/debian/setup/setup-go.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +set -e + +# Install go +sudo apt-get update \ + && sudo apt-get install --assume-yes \ + golang + && sudo rm -rf /var/lib/apt/lists/* + +# Configure GOPATH +export GOPATH=${DOCKER_GO_PATH} +echo "export GOPATH=${GOPATH}" | tee -a /home/${DEVCONTAINER_USERNAME}/.bashrc >>/dev/null + +sudo mkdir -p "${GOPATH}/bin" "${GOPATH}/src" +sudo chmod -R 777 "${GOPATH}" diff --git a/debian/setup/setup-helm.sh b/debian/setup/setup-helm.sh new file mode 100755 index 0000000..95da593 --- /dev/null +++ b/debian/setup/setup-helm.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -e + +# Install Helm +HELM_INSTALL_VERSION=${HELM_VERSION:-master} +curl --location --silent "https://raw.githubusercontent.com/helm/helm/${HELM_INSTALL_VERSION}/scripts/get-helm-3" | sudo bash - diff --git a/debian/setup/setup-imagemagick.sh b/debian/setup/setup-imagemagick.sh new file mode 100755 index 0000000..246edb1 --- /dev/null +++ b/debian/setup/setup-imagemagick.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -e + +# Install ImageMagick +sudo apt-get update \ + && sudo apt-get install --assume-yes \ + imagemagick \ + && sudo rm -rf /var/lib/apt/lists/* diff --git a/debian/setup/setup-kind.sh b/debian/setup/setup-kind.sh new file mode 100755 index 0000000..d9232d3 --- /dev/null +++ b/debian/setup/setup-kind.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +# Install kind +curl --silent "https://api.github.com/repos/kubernetes-sigs/kind/releases" | grep browser_download | grep linux | cut -d '"' -f 4 | grep amd64 | sort | tail -n 1 | xargs curl --location --output kind --silent +sudo install kind /usr/local/bin/ +sudo rm ./kind diff --git a/debian/setup/setup-kubernetes.sh b/debian/setup/setup-kubernetes.sh new file mode 100755 index 0000000..09b5359 --- /dev/null +++ b/debian/setup/setup-kubernetes.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +set -e + +# Configure docker socket +sudo tee "${DEVCONTAINER_SETUP_DIR}/setup-kube-config-copy.sh" >/dev/null \ + <>/home/${DEVCONTAINER_USERNAME}/.bashrc +chown ${DEVCONTAINER_USERNAME} /home/${DEVCONTAINER_USERNAME}/.bashrc + +# Install Kubectl +curl --location --output kubectl --silent "https://storage.googleapis.com/kubernetes-release/release/$(curl --location --silent https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl" +sudo install kubectl /usr/local/bin/ +sudo rm ./kubectl diff --git a/debian/setup/setup-kustomize.sh b/debian/setup/setup-kustomize.sh new file mode 100755 index 0000000..0d6c608 --- /dev/null +++ b/debian/setup/setup-kustomize.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -e + +# Install Kustomize +KUSTOMIZE_INSTALL_VERSION=${KUSTOMIZE_VERSION:-master} +curl --location --silent "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/${KUSTOMIZE_INSTALL_VERSION}/hack/install_kustomize.sh" | sudo bash +sudo install kustomize /usr/local/bin/ +sudo rm ./kustomize diff --git a/debian/setup/setup-live-share.sh b/debian/setup/setup-live-share.sh new file mode 100755 index 0000000..9d7cd5b --- /dev/null +++ b/debian/setup/setup-live-share.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +set -e + +# Install VS Code Live Share dependencies +sudo apt-get update \ + && sudo apt-get install --assume-yes \ + desktop-file-utils \ + gnome-keyring \ + libicu63 \ + libkrb5-3 \ + libsecret-1-0 \ + libssl1.1 \ + x11-utils \ + zlib1g \ + && sudo rm -rf /var/lib/apt/lists/* diff --git a/debian/setup/setup-minikube.sh b/debian/setup/setup-minikube.sh new file mode 100755 index 0000000..1d02097 --- /dev/null +++ b/debian/setup/setup-minikube.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -e + +# Install Minikube +MINIKUBE_INSTALL_VERSION=${MINIKUBE_VERSION:-latest} +curl --location --output minikube --silent "https://storage.googleapis.com/minikube/releases/${MINIKUBE_INSTALL_VERSION}/minikube-linux-amd64" +sudo install minikube /usr/local/bin/ +sudo rm ./minikube diff --git a/debian/setup/setup-node.sh b/debian/setup/setup-node.sh new file mode 100755 index 0000000..c21d8ab --- /dev/null +++ b/debian/setup/setup-node.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -e + +# Install nodejs, nodejs-npm +curl --location --silent "https://deb.nodesource.com/setup_14.x" | sudo bash - +sudo apt-get update \ + && sudo apt-get install --assume-yes \ + nodejs \ + && sudo rm -rf /var/lib/apt/lists/* diff --git a/debian/setup/setup-python2.sh b/debian/setup/setup-python2.sh new file mode 100644 index 0000000..7d4748e --- /dev/null +++ b/debian/setup/setup-python2.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e + +# Install python2 +sudo apt-get update \ + && sudo apt-get install --assume-yes \ + python2 \ + && sudo rm -rf /var/lib/apt/lists/* + +# Install pip +curl https://bootstrap.pypa.io/pip/2.7/get-pip.py | sudo python2 diff --git a/debian/setup/setup-python3.sh b/debian/setup/setup-python3.sh new file mode 100644 index 0000000..06e254b --- /dev/null +++ b/debian/setup/setup-python3.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +set -e + +# Install python2 +sudo apt-get update \ + && sudo apt-get install --assume-yes \ + python3 \ + python3-distutils \ + && sudo rm -rf /var/lib/apt/lists/* + +# Install pip +curl https://bootstrap.pypa.io/get-pip.py | sudo python3 diff --git a/debian/setup/setup-skaffold.sh b/debian/setup/setup-skaffold.sh new file mode 100755 index 0000000..a00dfc7 --- /dev/null +++ b/debian/setup/setup-skaffold.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -e + +# Install Skaffold +SKAFFOLD_INSTALL_VERSION=${SKAFFOLD_VERSION:-latest} +curl --location --output skaffold --silent "https://storage.googleapis.com/skaffold/releases/${SKAFFOLD_INSTALL_VERSION}/skaffold-linux-amd64" +sudo install skaffold /usr/local/bin/ +sudo rm ./skaffold diff --git a/debian/setup/setup-vscode-server-directory.sh b/debian/setup/setup-vscode-server-directory.sh new file mode 100755 index 0000000..2836b03 --- /dev/null +++ b/debian/setup/setup-vscode-server-directory.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e + +# Create vscode server folders +sudo mkdir -p \ + /home/$DEVCONTAINER_USERNAME/.vscode-server/extensions \ + /home/$DEVCONTAINER_USERNAME/.vscode-server-insiders/extensions + +sudo chown -R $DEVCONTAINER_USERNAME \ + /home/$DEVCONTAINER_USERNAME/.vscode-server \ + /home/$DEVCONTAINER_USERNAME/.vscode-server-insiders