|
| 1 | +ARG DEBIAN_VERSION=bullseye-slim |
| 2 | +ARG DOCKER_VERSION=20.10.2 |
| 3 | +ARG DOCKER_COMPOSE_VERSION=debian-1.28.4 |
| 4 | +ARG GOLANG_VERSION=1.15 |
| 5 | +ARG GOLANGCI_LINT_VERSION=v1.37.1 |
| 6 | + |
| 7 | +FROM docker:${DOCKER_VERSION} AS docker-cli |
| 8 | +FROM docker/compose:${DOCKER_COMPOSE_VERSION} AS docker-compose |
| 9 | +FROM golangci/golangci-lint:${GOLANGCI_LINT_VERSION} as golangci-lint |
| 10 | + |
| 11 | +FROM golang:latest |
| 12 | + |
| 13 | +# Configure to avoid build warnings and errors as described in official VSCode Remote-Containers extension documentation. |
| 14 | +# See https://code.visualstudio.com/docs/remote/containers-advanced#_reducing-dockerfile-build-warnings. |
| 15 | +ENV DEBIAN_FRONTEND=noninteractive |
| 16 | +# CA certificates |
| 17 | +RUN apt-get update -y && \ |
| 18 | + # CA certificates |
| 19 | + apt-get install -y --no-install-recommends ca-certificates && \ |
| 20 | + # Timezone |
| 21 | + apt-get install -y --no-install-recommends tzdata && \ |
| 22 | + # Setup Git and SSH |
| 23 | + apt-get install -y --no-install-recommends git openssh-client && \ |
| 24 | + # Setup sudo |
| 25 | + apt-get install -y --no-install-recommends sudo && \ |
| 26 | + # Setup shell |
| 27 | + apt-get install -y --no-install-recommends zsh nano locales && \ |
| 28 | + apt-get autoremove -y && \ |
| 29 | + apt-get clean -y && \ |
| 30 | + rm -r /var/cache/* /var/lib/apt/lists/* |
| 31 | + |
| 32 | +ARG USERNAME=vscode |
| 33 | +ARG USER_UID=1000 |
| 34 | +ARG USER_GID=1000 |
| 35 | + |
| 36 | +ENV TZ= |
| 37 | +WORKDIR /home/${USERNAME} |
| 38 | +RUN addgroup --gid $USER_GID $USERNAME && \ |
| 39 | + useradd $USERNAME --shell /bin/sh --uid $USER_UID --gid $USER_GID && \ |
| 40 | + mkdir -p /etc/sudoers.d && \ |
| 41 | + echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME && \ |
| 42 | + chmod 0440 /etc/sudoers.d/$USERNAME && \ |
| 43 | + rm /var/log/faillog /var/log/lastlog |
| 44 | + |
| 45 | +# Setup shell for root and ${USERNAME} |
| 46 | +ENTRYPOINT [ "/bin/zsh" ] |
| 47 | + |
| 48 | +ENV EDITOR=nano \ |
| 49 | + LANG=en_US.UTF-8 \ |
| 50 | + # MacOS compatibility |
| 51 | + TERM=xterm |
| 52 | + |
| 53 | +RUN echo "LC_ALL=en_US.UTF-8" >> /etc/environment && \ |
| 54 | + echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && \ |
| 55 | + echo "LANG=en_US.UTF-8" > /etc/locale.conf && \ |
| 56 | + locale-gen en_US.UTF-8 |
| 57 | + |
| 58 | +RUN usermod --shell /bin/zsh root && \ |
| 59 | + usermod --shell /bin/zsh ${USERNAME} |
| 60 | + |
| 61 | +COPY --chown=${USER_UID}:${USER_GID} shell/.p10k.zsh shell/.zshrc shell/.welcome.sh /home/${USERNAME}/ |
| 62 | + |
| 63 | +RUN ln -s /home/${USERNAME}/.p10k.zsh /root/.p10k.zsh && \ |
| 64 | + cp /home/${USERNAME}/.zshrc /root/.zshrc && \ |
| 65 | + cp /home/${USERNAME}/.welcome.sh /root/.welcome.sh && \ |
| 66 | + sed -i "s/HOMEPATH/home\/${USERNAME}/" /home/${USERNAME}/.zshrc && \ |
| 67 | + sed -i "s/HOMEPATH/root/" /root/.zshrc |
| 68 | + |
| 69 | +ARG POWERLEVEL10K_VERSION=v1.14.6 |
| 70 | + |
| 71 | +RUN git clone --single-branch --depth 1 https://github.com/robbyrussell/oh-my-zsh.git /home/${USERNAME}/.oh-my-zsh && \ |
| 72 | + git clone --branch ${POWERLEVEL10K_VERSION} --single-branch --depth 1 https://github.com/romkatv/powerlevel10k.git /home/${USERNAME}/.oh-my-zsh/custom/themes/powerlevel10k && \ |
| 73 | + rm -rf /home/${USERNAME}/.oh-my-zsh/custom/themes/powerlevel10k/.git && \ |
| 74 | + chown -R ${USERNAME}:${USER_GID} /home/${USERNAME} && \ |
| 75 | + chmod -R 700 /home/${USERNAME} && \ |
| 76 | + cp -r /home/${USERNAME}/.oh-my-zsh /root/.oh-my-zsh && \ |
| 77 | + chown -R root:root /root/.oh-my-zsh |
| 78 | + |
| 79 | +# Docker |
| 80 | +COPY --from=docker-cli --chown=${USER_UID}:${USER_GID} /usr/local/bin/docker /usr/local/bin/docker |
| 81 | +COPY --from=docker-compose --chown=${USER_UID}:${USER_GID} /usr/local/bin/docker-compose /usr/local/bin/docker-compose |
| 82 | +ENV DOCKER_BUILDKIT=1 \ |
| 83 | + COMPOSE_DOCKER_CLI_BUILD=1 |
| 84 | +# All possible docker host groups |
| 85 | +RUN G102=`getent group 102 | cut -d":" -f 1` && \ |
| 86 | + G976=`getent group 976 | cut -d":" -f 1` && \ |
| 87 | + G1000=`getent group 1000 | cut -d":" -f 1` && \ |
| 88 | + if [ -z $G102 ]; then G102=docker102; addgroup --gid 102 $G102; fi && \ |
| 89 | + if [ -z $G976 ]; then G976=docker976; addgroup --gid 976 $G976; fi && \ |
| 90 | + if [ -z $G1000 ]; then G1000=docker1000; addgroup --gid 1000 $G1000; fi && \ |
| 91 | + addgroup ${USERNAME} $G102 && \ |
| 92 | + addgroup ${USERNAME} $G976 && \ |
| 93 | + addgroup ${USERNAME} $G1000 |
| 94 | + |
| 95 | +RUN apt-get update -y \ |
| 96 | + && apt-get -y install --no-install-recommends apt-utils 2>&1 \ |
| 97 | + # Verify git, process tools, lsb-release (common in install instructions for CLIs) installed. |
| 98 | + && apt-get -y install git iproute2 procps lsb-release \ |
| 99 | + # Install Python2.7 |
| 100 | + && apt-get install -y python2.7 python-pip unzip \ |
| 101 | + && apt-get install -y protobuf-compiler \ |
| 102 | + && apt-get autoremove -y \ |
| 103 | + && apt-get clean -y \ |
| 104 | + && rm -rf /var/lib/apt/lists/* |
| 105 | + |
| 106 | +ENV GOPATH=/go |
| 107 | +ENV PATH=$GOPATH/bin:/usr/local/go/bin:$PATH |
| 108 | +ARG GOPLS_VERSION=v0.6.6 |
| 109 | +ARG DELVE_VERSION=v1.5.0 |
| 110 | +ARG GOMODIFYTAGS_VERSION=v1.13.0 |
| 111 | +ARG GOPLAY_VERSION=v1.0.0 |
| 112 | +ARG GOTESTS_VERSION=v1.5.3 |
| 113 | +ARG MOCK_VERSION=v1.5.0 |
| 114 | +ARG MOCKERY_VERSION=v2.3.0 |
| 115 | + |
| 116 | +RUN mkdir -p ${GOPATH}/src/github.com && \ |
| 117 | + chown -R ${USER_UID}:${USER_GID} ${GOPATH} |
| 118 | + |
| 119 | +USER ${USERNAME} |
| 120 | + |
| 121 | +COPY --from=golangci-lint /usr/bin/golangci-lint ${GOPATH}/bin |
| 122 | +RUN go get -v golang.org/x/tools/gopls@${GOPLS_VERSION} 2>&1 |
| 123 | +RUN go get -v \ |
| 124 | + # Base Go tools needed for VS code Go extension |
| 125 | + golang.org/x/tools/cmd/guru \ |
| 126 | + golang.org/x/tools/cmd/gorename \ |
| 127 | + github.com/go-delve/delve/cmd/dlv@${DELVE_VERSION} \ |
| 128 | + github.com/uudashr/gopkgs/v2/cmd/gopkgs@latest \ |
| 129 | + github.com/ramya-rao-a/go-outline \ |
| 130 | + # Extra tools integrating with VS code |
| 131 | + github.com/fatih/gomodifytags@${GOMODIFYTAGS_VERSION} \ |
| 132 | + github.com/haya14busa/goplay/cmd/goplay@${GOPLAY_VERSION} \ |
| 133 | + github.com/cweill/gotests/...@${GOTESTS_VERSION} \ |
| 134 | + github.com/davidrjenni/reftools/cmd/fillstruct \ |
| 135 | + # Terminal tools |
| 136 | + github.com/golang/mock/gomock@${MOCK_VERSION} \ |
| 137 | + github.com/golang/mock/mockgen@${MOCK_VERSION} \ |
| 138 | + github.com/vektra/mockery/v2/...@${MOCKERY_VERSION} \ |
| 139 | + 2>&1 |
| 140 | + |
| 141 | +USER root |
| 142 | + |
| 143 | +# EXTRA TOOLS |
| 144 | +# Kubectl |
| 145 | +ARG KUBECTL_VERSION=v1.19.4 |
| 146 | +RUN wget -qO /usr/local/bin/kubectl "https://storage.googleapis.com/kubernetes-release/release/${KUBECTL_VERSION}/bin/linux/amd64/kubectl" && \ |
| 147 | + chmod 755 /usr/local/bin/kubectl |
| 148 | + |
| 149 | +# Stern |
| 150 | +ARG STERN_VERSION=1.11.0 |
| 151 | +RUN wget -qO /usr/local/bin/stern https://github.com/wercker/stern/releases/download/${STERN_VERSION}/stern_$(uname -s)_amd64 && \ |
| 152 | + chown ${USER_UID}:${USER_GID} /usr/local/bin/stern && \ |
| 153 | + chmod 755 /usr/local/bin/stern |
| 154 | + |
| 155 | +# Kubectx and Kubens |
| 156 | +ARG KUBECTX_VERSION=v0.9.3 |
| 157 | +RUN wget -qO- "https://github.com/ahmetb/kubectx/releases/download/${KUBECTX_VERSION}/kubectx_${KUBECTX_VERSION}_$(uname -s)_$(uname -m).tar.gz" | \ |
| 158 | + tar -xzC /usr/local/bin kubectx && \ |
| 159 | + wget -qO- "https://github.com/ahmetb/kubectx/releases/download/${KUBECTX_VERSION}/kubens_${KUBECTX_VERSION}_$(uname -s)_$(uname -m).tar.gz" | \ |
| 160 | + tar -xzC /usr/local/bin kubens && \ |
| 161 | + chmod 755 /usr/local/bin/kube* |
| 162 | + |
| 163 | +# Helm |
| 164 | +ARG HELM3_VERSION=v3.5.2 |
| 165 | +RUN wget -qO- "https://get.helm.sh/helm-${HELM3_VERSION}-linux-amd64.tar.gz" | \ |
| 166 | + tar -xzC /usr/local/bin --strip-components=1 linux-amd64/helm && \ |
| 167 | + chmod 755 /usr/local/bin/helm* |
| 168 | + |
| 169 | +# AWS CLI |
| 170 | +RUN wget -qO awscli2.zip "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" && \ |
| 171 | + unzip awscli2.zip && \ |
| 172 | + ./aws/install && \ |
| 173 | + rm awscli2.zip |
| 174 | + |
| 175 | + |
| 176 | +# Revert configurations that was set at top layer (for avoiding build warnings and errors). |
| 177 | +ENV DEBIAN_FRONTEND=dialog |
| 178 | + |
| 179 | +USER ${USERNAME} |
| 180 | + |
| 181 | +# Expose service ports. |
| 182 | +EXPOSE 8000 |
| 183 | + |
0 commit comments