mirror of
https://git.vectorsigma.ru/public/atlantis.git
synced 2026-08-03 15:18:52 +00:00
This has the potential to speed up rebuilds of the Atlantis container significantly, especially for non-x86 platforms which are emulated when done in GitHub Actions. It works by using cache mounts: https://docs.docker.com/engine/reference/builder/#run---mounttypecache. They mean we can have specific paths set that are carried over from one image build to the next, regardless of which files are changed in the project. The files are however at the same time not part of the final image, which reduces the generated "builder" image from 1.66 GB to just 386 MB on the current main branch. In my local tests, which doesn't make use of emulation, I saw a drop for the "go build" step going from taking just over 40 seconds with an empty cache to around 1 second when I make a one character change to a Go source file. That is otherwise a change that prior to this would cause a complete rebuild of the Docker image layer. Co-authored-by: nitrocode <7775707+nitrocode@users.noreply.github.com>
71 lines
3.4 KiB
Docker
71 lines
3.4 KiB
Docker
# Stage 1: build artifact
|
|
FROM golang:1.19.3-alpine AS builder
|
|
|
|
WORKDIR /app
|
|
COPY . /app
|
|
RUN --mount=type=cache,target=/go/pkg/mod \
|
|
--mount=type=cache,target=/root/.cache/go-build \
|
|
CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -v -o atlantis .
|
|
|
|
# Stage 2
|
|
# The runatlantis/atlantis-base is created by docker-base/Dockerfile.
|
|
FROM ghcr.io/runatlantis/atlantis-base:2022.11.24 AS base
|
|
|
|
# Get the architecture the image is being built for
|
|
ARG TARGETPLATFORM
|
|
|
|
# install terraform binaries
|
|
ENV DEFAULT_TERRAFORM_VERSION=1.3.6
|
|
|
|
# In the official Atlantis image we only have the latest of each Terraform version.
|
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
|
RUN AVAILABLE_TERRAFORM_VERSIONS="1.0.11 1.1.9 1.2.9 ${DEFAULT_TERRAFORM_VERSION}" && \
|
|
case "${TARGETPLATFORM}" in \
|
|
"linux/amd64") TERRAFORM_ARCH=amd64 ;; \
|
|
"linux/arm64") TERRAFORM_ARCH=arm64 ;; \
|
|
"linux/arm/v7") TERRAFORM_ARCH=arm ;; \
|
|
*) echo "ERROR: 'TARGETPLATFORM' value expected: ${TARGETPLATFORM}"; exit 1 ;; \
|
|
esac && \
|
|
for VERSION in ${AVAILABLE_TERRAFORM_VERSIONS}; do \
|
|
curl -LOs "https://releases.hashicorp.com/terraform/${VERSION}/terraform_${VERSION}_linux_${TERRAFORM_ARCH}.zip" && \
|
|
curl -LOs "https://releases.hashicorp.com/terraform/${VERSION}/terraform_${VERSION}_SHA256SUMS" && \
|
|
sed -n "/terraform_${VERSION}_linux_${TERRAFORM_ARCH}.zip/p" "terraform_${VERSION}_SHA256SUMS" | sha256sum -c && \
|
|
mkdir -p "/usr/local/bin/tf/versions/${VERSION}" && \
|
|
unzip "terraform_${VERSION}_linux_${TERRAFORM_ARCH}.zip" -d "/usr/local/bin/tf/versions/${VERSION}" && \
|
|
ln -s "/usr/local/bin/tf/versions/${VERSION}/terraform" "/usr/local/bin/terraform${VERSION}" && \
|
|
rm "terraform_${VERSION}_linux_${TERRAFORM_ARCH}.zip" && \
|
|
rm "terraform_${VERSION}_SHA256SUMS"; \
|
|
done && \
|
|
ln -s "/usr/local/bin/tf/versions/${DEFAULT_TERRAFORM_VERSION}/terraform" /usr/local/bin/terraform
|
|
|
|
ENV DEFAULT_CONFTEST_VERSION=0.35.0
|
|
|
|
RUN AVAILABLE_CONFTEST_VERSIONS="${DEFAULT_CONFTEST_VERSION}" && \
|
|
case ${TARGETPLATFORM} in \
|
|
"linux/amd64") CONFTEST_ARCH=x86_64 ;; \
|
|
"linux/arm64") CONFTEST_ARCH=arm64 ;; \
|
|
# There is currently no compiled version of conftest for armv7
|
|
"linux/arm/v7") CONFTEST_ARCH=x86_64 ;; \
|
|
esac && \
|
|
for VERSION in ${AVAILABLE_CONFTEST_VERSIONS}; do \
|
|
curl -LOs https://github.com/open-policy-agent/conftest/releases/download/v${VERSION}/conftest_${VERSION}_Linux_${CONFTEST_ARCH}.tar.gz && \
|
|
curl -LOs https://github.com/open-policy-agent/conftest/releases/download/v${VERSION}/checksums.txt && \
|
|
sed -n "/conftest_${VERSION}_Linux_${CONFTEST_ARCH}.tar.gz/p" checksums.txt | sha256sum -c && \
|
|
mkdir -p /usr/local/bin/cft/versions/${VERSION} && \
|
|
tar -C /usr/local/bin/cft/versions/${VERSION} -xzf conftest_${VERSION}_Linux_${CONFTEST_ARCH}.tar.gz && \
|
|
ln -s /usr/local/bin/cft/versions/${VERSION}/conftest /usr/local/bin/conftest${VERSION} && \
|
|
rm conftest_${VERSION}_Linux_${CONFTEST_ARCH}.tar.gz && \
|
|
rm checksums.txt; \
|
|
done
|
|
|
|
RUN ln -s /usr/local/bin/cft/versions/${DEFAULT_CONFTEST_VERSION}/conftest /usr/local/bin/conftest
|
|
|
|
# copy binary
|
|
COPY --from=builder /app/atlantis /usr/local/bin/atlantis
|
|
|
|
# copy docker entrypoint
|
|
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
|
|
|
|
ENTRYPOINT ["docker-entrypoint.sh"]
|
|
CMD ["server"]
|