@@ -5,22 +5,36 @@ FROM python:3.12-alpine@sha256:9b8808206f4a956130546a32cbdd8633bc973b19db2923b72
55FROM python_base AS builder
66ARG TARGETOS
77ARG TARGETARCH
8+
89WORKDIR /bin_dir
10+
911RUN apk add --no-cache \
12+ # Builder deps
1013 bash=~5 \
1114 curl=~8 && \
15+ # Upgrade packages for be able get latest Checkov
1216 python3 -m pip install --no-cache-dir --upgrade \
1317 pip~=25.0 \
1418 setuptools~=75.8
19+
1520COPY tools/install/ /install/
21+
22+ #
23+ # Install required tools
24+ #
1625ARG PRE_COMMIT_VERSION=${PRE_COMMIT_VERSION:-latest}
1726RUN touch /.env && \
1827 if [ "$PRE_COMMIT_VERSION" = "false" ]; then \
1928 echo "Vital software can't be skipped" && exit 1; \
2029 fi
2130RUN /install/pre-commit.sh
31+
32+ #
33+ # Install tools
34+ #
2235ARG OPENTOFU_VERSION=${OPENTOFU_VERSION:-false}
2336ARG TERRAFORM_VERSION=${TERRAFORM_VERSION:-false}
37+
2438ARG CHECKOV_VERSION=${CHECKOV_VERSION:-false}
2539ARG HCLEDIT_VERSION=${HCLEDIT_VERSION:-false}
2640ARG INFRACOST_VERSION=${INFRACOST_VERSION:-false}
@@ -31,10 +45,16 @@ ARG TFLINT_VERSION=${TFLINT_VERSION:-false}
3145ARG TFSEC_VERSION=${TFSEC_VERSION:-false}
3246ARG TFUPDATE_VERSION=${TFUPDATE_VERSION:-false}
3347ARG TRIVY_VERSION=${TRIVY_VERSION:-false}
48+
49+
50+ # Tricky thing to install all tools by set only one arg.
51+ # In RUN command below used `. /.env` <- this is sourcing vars that
52+ # specified in step below
3453ARG INSTALL_ALL=${INSTALL_ALL:-false}
3554RUN if [ "$INSTALL_ALL" != "false" ]; then \
3655 echo "OPENTOFU_VERSION=latest" >> /.env && \
3756 echo "TERRAFORM_VERSION=latest" >> /.env && \
57+ \
3858 echo "CHECKOV_VERSION=latest" >> /.env && \
3959 echo "HCLEDIT_VERSION=latest" >> /.env && \
4060 echo "INFRACOST_VERSION=latest" >> /.env && \
@@ -46,8 +66,12 @@ RUN if [ "$INSTALL_ALL" != "false" ]; then \
4666 echo "TFUPDATE_VERSION=latest" >> /.env && \
4767 echo "TRIVY_VERSION=latest" >> /.env \
4868 ; fi
69+
70+ # Docker `RUN`s shouldn't be consolidated here
71+ # hadolint global ignore=DL3059
4972RUN /install/opentofu.sh
5073RUN /install/terraform.sh
74+
5175RUN /install/checkov.sh
5276RUN /install/hcledit.sh
5377RUN /install/infracost.sh
@@ -59,33 +83,85 @@ RUN /install/tfsec.sh
5983RUN /install/tfupdate.sh
6084RUN /install/trivy.sh
6185
86+
87+ # Checking binaries versions and write it to debug file
88+
89+ # SC2086 - We do not need to quote "$F" variable, because it's not contain spaces
90+ # DL4006 - Not Applicable for /bin/sh in alpine images. Disable, as recommended by check itself
91+ # hadolint ignore=SC2086,DL4006
92+ RUN . /.env && \
93+ F=tools_versions_info && \
94+ pre-commit --version >> $F && \
95+ (if [ "$OPENTOFU_VERSION" != "false" ]; then ./tofu --version | head -n 1 >> $F; else echo "opentofu SKIPPED" >> $F ; fi) && \
96+ (if [ "$TERRAFORM_VERSION" != "false" ]; then ./terraform --version | head -n 1 >> $F; else echo "terraform SKIPPED" >> $F ; fi) && \
97+ \
98+ (if [ "$CHECKOV_VERSION" != "false" ]; then echo "checkov $(checkov --version)" >> $F; else echo "checkov SKIPPED" >> $F ; fi) && \
99+ (if [ "$HCLEDIT_VERSION" != "false" ]; then echo "hcledit $(./hcledit version)" >> $F; else echo "hcledit SKIPPED" >> $F ; fi) && \
100+ (if [ "$INFRACOST_VERSION" != "false" ]; then echo "$(./infracost --version)" >> $F; else echo "infracost SKIPPED" >> $F ; fi) && \
101+ (if [ "$TERRAFORM_DOCS_VERSION" != "false" ]; then ./terraform-docs --version >> $F; else echo "terraform-docs SKIPPED" >> $F ; fi) && \
102+ (if [ "$TERRAGRUNT_VERSION" != "false" ]; then ./terragrunt --version >> $F; else echo "terragrunt SKIPPED" >> $F ; fi) && \
103+ (if [ "$TERRASCAN_VERSION" != "false" ]; then echo "terrascan $(./terrascan version)" >> $F; else echo "terrascan SKIPPED" >> $F ; fi) && \
104+ (if [ "$TFLINT_VERSION" != "false" ]; then ./tflint --version >> $F; else echo "tflint SKIPPED" >> $F ; fi) && \
105+ (if [ "$TFSEC_VERSION" != "false" ]; then echo "tfsec $(./tfsec --version)" >> $F; else echo "tfsec SKIPPED" >> $F ; fi) && \
106+ (if [ "$TFUPDATE_VERSION" != "false" ]; then echo "tfupdate $(./tfupdate --version)" >> $F; else echo "tfupdate SKIPPED" >> $F ; fi) && \
107+ (if [ "$TRIVY_VERSION" != "false" ]; then echo "trivy $(./trivy --version)" >> $F; else echo "trivy SKIPPED" >> $F ; fi) && \
108+ printf "\n\n\n" && cat $F && printf "\n\n\n"
109+
110+
111+
62112FROM python_base
113+
63114RUN apk add --no-cache \
115+ # pre-commit deps
64116 git=~2 \
117+ # All hooks deps
65118 bash=~5 \
119+ # pre-commit-hooks deps: https://github.com/pre-commit/pre-commit-hooks
66120 musl-dev=~1 \
67121 gcc=~14 \
122+ # entrypoint wrapper deps
68123 su-exec=~0.2 \
124+ # ssh-client for external private module in ssh
69125 openssh-client=~10
70- COPY --from=builder /usr/local/bin/pre-commit /usr/local/bin/checkov* /usr/bin/
71- COPY --from=builder /bin_dir/ /usr/bin/
126+
127+ # Copy tools
128+ COPY --from=builder \
129+ # Needed for all hooks
130+ /usr/local/bin/pre-commit \
131+ # Hooks and terraform binaries
132+ /bin_dir/ \
133+ /usr/local/bin/checkov* \
134+ /usr/bin/
135+ # Copy pre-commit packages
72136COPY --from=builder /usr/local/lib/python3.12/site-packages/ /usr/local/lib/python3.12/site-packages/
137+ # Copy terrascan policies
73138COPY --from=builder /root/ /root/
139+
140+ # Copy hook scripts for Docker-based hooks
74141COPY hooks/ /usr/local/bin/hooks/
75142COPY lib_getopt /usr/local/bin/
76143COPY src/pre_commit_terraform/ /usr/local/lib/python3.12/site-packages/pre_commit_terraform/
144+
145+ # Install hooks extra deps
77146RUN if [ "$(grep -o '^terraform-docs SKIPPED$' /usr/bin/tools_versions_info)" = "" ]; then \
78147 apk add --no-cache perl=~5 \
79148 ; fi && \
80149 if [ "$(grep -o '^infracost SKIPPED$' /usr/bin/tools_versions_info)" = "" ]; then \
81150 apk add --no-cache jq=~1 \
82151 ; fi && \
152+ # Fix git runtime fatal:
153+ # unsafe repository ('/lint' is owned by someone else)
83154 git config --global --add safe.directory /lint
155+
84156COPY tools/entrypoint.sh /entrypoint.sh
157+
158+ # Copy hook scripts for docker_image language support
85159COPY hooks/ /usr/bin/hooks/
86160COPY lib_getopt /usr/bin/lib_getopt
87161RUN chmod +x /usr/bin/hooks/*.sh
162+
88163ENV PRE_COMMIT_COLOR=${PRE_COMMIT_COLOR:-always}
164+
89165ENV INFRACOST_API_KEY=${INFRACOST_API_KEY:-}
90166ENV INFRACOST_SKIP_UPDATE_CHECK=${INFRACOST_SKIP_UPDATE_CHECK:-false}
91167
0 commit comments