Dockerfile 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. # Stage 1: Build a minimum CI Builder image that we can use for the initial
  10. # steps like `mkpipeline` and `Build`, as well as any tests that are self
  11. # contained and use other Docker images.
  12. FROM ubuntu:oracular-20250619 AS ci-builder-min
  13. WORKDIR /workdir
  14. ARG ARCH_GCC
  15. ARG ARCH_GO
  16. # Environment variables that should be set for the entire build container.
  17. # Ensure any Rust binaries that crash print a backtrace.
  18. ENV RUST_BACKTRACE=1
  19. # Ensure that all python output is unbuffered, otherwise it is not
  20. # logged properly in Buildkite.
  21. ENV PYTHONUNBUFFERED=1
  22. # Set a environment variable that tools can check to see if they're in the
  23. # builder or not.
  24. ENV MZ_DEV_CI_BUILDER=1
  25. # Faster uncompression
  26. ARG XZ_OPT=-T0
  27. # Absolute minimum set of dependencies needed for a CI job.
  28. #
  29. # Please take care with what gets added here. The goal of this initial layer is to be as small as
  30. # possible since it's used for the `mkpipeline` and `Build` CI jobs, which block __all other__
  31. # jobs.
  32. RUN apt-get update --fix-missing && TZ=UTC DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
  33. ca-certificates \
  34. curl \
  35. docker.io \
  36. eatmydata \
  37. gdb \
  38. git \
  39. gnupg2 \
  40. libxml2 \
  41. pigz \
  42. python3 \
  43. python3.12-venv \
  44. zstd \
  45. && apt-get clean \
  46. && rm -rf /var/lib/apt/lists/* \
  47. && rm -rf /usr/share/doc/* /usr/share/man/* /usr/share/info/* /usr/share/locale/* /var/cache/* /var/log/*
  48. RUN curl -fsSL https://github.com/trufflesecurity/trufflehog/releases/download/v3.89.1/trufflehog_3.89.1_linux_$ARCH_GO.tar.gz > trufflehog.tar.gz \
  49. && if [ $ARCH_GO = amd64 ]; then echo 'c187e25dd1a68ba24a47cc15f334625cb5a7b77f4c75837398950accfc752d59 trufflehog.tar.gz' | sha256sum --check; fi \
  50. && if [ $ARCH_GO = arm64 ]; then echo '5c3786dec219d17c1f3a5f2f97ef8fa16b029ce7df19ca2389e667eca492f78d trufflehog.tar.gz' | sha256sum --check; fi \
  51. && tar -xzf trufflehog.tar.gz -C /usr/local/bin trufflehog
  52. # Install Python dependencies. These are necessary to run some of our base tooling.
  53. COPY requirements.txt /workdir/
  54. RUN curl -LsSf https://astral.sh/uv/0.4.25/install.sh | UV_INSTALL_DIR=/usr/local UV_UNMANAGED_INSTALL=1 sh \
  55. && uv pip install --system --break-system-packages -r /workdir/requirements.txt && rm /workdir/requirements*.txt
  56. # Install extra tools not available in apt repositories.
  57. COPY rust.asc .
  58. RUN gpg --import rust.asc \
  59. && rm rust.asc \
  60. && echo "trusted-key 85AB96E6FA1BE5FE" >> ~/.gnupg/gpg.conf
  61. ARG BAZEL_VERSION
  62. ARG RUST_DATE
  63. ARG RUST_VERSION
  64. RUN \
  65. # 1. autouseradd
  66. #
  67. # Ensures that the UID used when running the container has a proper entry in
  68. # `/etc/passwd`, and writable home directory.
  69. curl -fsSL https://github.com/benesch/autouseradd/releases/download/1.3.0/autouseradd-1.3.0-$ARCH_GO.tar.gz \
  70. | tar xz -C / --strip-components 1 \
  71. # 2. Bazel
  72. #
  73. # We primarily build Materialize via Bazel in CI, and Bazel pulls in its own dependencies.
  74. && arch_bazel=$(echo "$ARCH_GCC" | sed -e "s/aarch64/arm64/" -e "s/amd64/x86_64/") bazel_version=$(echo "$BAZEL_VERSION") \
  75. && curl -fsSL -o /usr/local/bin/bazel https://github.com/bazelbuild/bazel/releases/download/$bazel_version/bazel-$bazel_version-linux-$arch_bazel \
  76. && if [ "$arch_bazel" = arm64 ]; then echo 'fac4b954e0501c2be8b9653a550b443eb85284e568d08b102977e2bf587b09d7 /usr/local/bin/bazel' | sha256sum --check; fi \
  77. && if [ "$arch_bazel" = x86_64 ]; then echo '48ea0ff9d397a48add6369c261c5a4431fe6d5d5348cfb81411782fb80c388d3 /usr/local/bin/bazel' | sha256sum --check; fi \
  78. && chmod +x /usr/local/bin/bazel \
  79. # 3. Docker
  80. #
  81. # If you upgrade Docker (Compose) version here, also update it in misc/python/cli/mzcompose.py.
  82. && mkdir -p /usr/local/lib/docker/cli-plugins \
  83. && curl -fsSL https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-$ARCH_GCC > /usr/local/lib/docker/cli-plugins/docker-compose \
  84. && chmod +x /usr/local/lib/docker/cli-plugins/docker-compose \
  85. && curl -fsSL https://github.com/christian-korneck/docker-pushrm/releases/download/v1.9.0/docker-pushrm_linux_$ARCH_GO > /usr/local/lib/docker/cli-plugins/docker-pushrm \
  86. && chmod +x /usr/local/lib/docker/cli-plugins/docker-pushrm \
  87. && curl -fsSL https://github.com/docker/buildx/releases/download/v0.25.0/buildx-v0.25.0.linux-$ARCH_GO > /usr/local/lib/docker/cli-plugins/docker-buildx \
  88. && chmod +x /usr/local/lib/docker/cli-plugins/docker-buildx \
  89. # 4. Cargo
  90. #
  91. # Some parts of our stack use 'cargo' to read metadata, so we install just that. Importantly we
  92. # do not install 'rustc' or any of the other tools, this keeps the Docker image small.
  93. && mkdir rust \
  94. && curl -fsSL https://static.rust-lang.org/dist$RUST_DATE/rust-$RUST_VERSION-$ARCH_GCC-unknown-linux-gnu.tar.gz > rust.tar.gz \
  95. && curl -fsSL https://static.rust-lang.org/dist$RUST_DATE/rust-$RUST_VERSION-$ARCH_GCC-unknown-linux-gnu.tar.gz.asc > rust.asc \
  96. && gpg --verify rust.asc rust.tar.gz \
  97. && tar -xzf rust.tar.gz -C rust --strip-components=1 \
  98. && rust/install.sh --components=cargo \
  99. && rm -rf rust.asc rust.tar.gz rust
  100. # Remove Ubuntu user causing UID collisions.
  101. # https://bugs.launchpad.net/cloud-images/+bug/2005129
  102. RUN userdel -r ubuntu
  103. ENTRYPOINT ["autouseradd", "--user", "materialize"]
  104. # Stage 2: Build a full CI Builder image that can be used for any CI job.
  105. FROM ci-builder-min as ci-builder-full
  106. ARG ARCH_GCC
  107. ARG ARCH_GO
  108. WORKDIR /workdir
  109. # Install dependencies needed by any CI job. Not all of these are available in
  110. # the Ubuntu repositories.
  111. RUN apt-get update --fix-missing && TZ=UTC DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
  112. autoconf \
  113. automake \
  114. binfmt-support \
  115. bsdmainutils \
  116. ca-certificates \
  117. clang \
  118. cmake \
  119. curl \
  120. docker.io \
  121. gcc \
  122. g++ \
  123. gdb \
  124. git \
  125. gnupg2 \
  126. jq \
  127. lcov \
  128. libc-dbg \
  129. libclang-common-18-dev \
  130. libclang-dev \
  131. libclang-rt-18-dev \
  132. libpq-dev \
  133. lld \
  134. llvm \
  135. make \
  136. npm \
  137. openssh-client \
  138. pkg-config \
  139. postgresql-client \
  140. python3 \
  141. python3-dev \
  142. python3-setuptools \
  143. rsync \
  144. ruby \
  145. unzip \
  146. xz-utils \
  147. yamllint \
  148. && apt-get clean \
  149. && rm -rf /var/lib/apt/lists/* \
  150. && rm -rf /usr/share/doc/* /usr/share/man/* /usr/share/info/* /usr/share/locale/* /var/cache/* /var/log/*
  151. # Install Node.js LTS, for our Python typechecker. This is up here because we don't
  152. # expect it to change often.
  153. COPY nodesource.asc .
  154. RUN gpg --dearmor < nodesource.asc > /etc/apt/keyrings/nodesource.gpg \
  155. && rm nodesource.asc \
  156. && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \
  157. && apt-get update \
  158. && apt-get install -y --no-install-recommends nodejs \
  159. && apt-get clean \
  160. && rm -rf /var/lib/apt/lists/*
  161. RUN curl -fsSL https://github.com/koalaman/shellcheck/releases/download/v0.8.0/shellcheck-v0.8.0.linux.$ARCH_GCC.tar.xz > shellcheck.tar.xz \
  162. && tar -xJf shellcheck.tar.xz -C /usr/local/bin --strip-components 1 shellcheck-v0.8.0/shellcheck \
  163. && rm shellcheck.tar.xz \
  164. && curl -fsSL https://github.com/bufbuild/buf/releases/download/v1.18.0/buf-Linux-$ARCH_GCC.tar.gz > buf.tar.gz \
  165. && tar -xf buf.tar.gz -C /usr/local/bin --strip-components 2 buf/bin \
  166. && rm buf.tar.gz \
  167. && chmod +x /usr/local/bin/buf /usr/local/bin/protoc-gen-buf-breaking /usr/local/bin/protoc-gen-buf-lint \
  168. && curl -fsSL https://github.com/boz/kail/releases/download/v0.16.1/kail_v0.16.1_linux_$ARCH_GO.tar.gz > kail.tar.gz \
  169. && tar -xf kail.tar.gz -C /usr/local/bin kail \
  170. && rm kail.tar.gz \
  171. && chmod +x /usr/local/bin/kail \
  172. && curl -fsSL https://github.com/parca-dev/parca-debuginfo/releases/download/v0.11.0/parca-debuginfo_0.11.0_Linux_$(echo "$ARCH_GCC" | sed "s/aarch64/arm64/").tar.gz \
  173. | tar xz -C /usr/local/bin parca-debuginfo
  174. ENTRYPOINT ["autouseradd", "--user", "materialize"]
  175. # Install Rust. This is done separately from above because we bump the Rust
  176. # version frequently, and we want to reuse the cache up through above when
  177. # possible.
  178. COPY rust.asc .
  179. RUN gpg --import rust.asc \
  180. && rm rust.asc \
  181. && echo "trusted-key 85AB96E6FA1BE5FE" >> ~/.gnupg/gpg.conf
  182. ARG RUST_DATE
  183. ARG RUST_VERSION
  184. ARG RUST_COMPONENTS
  185. RUN mkdir rust \
  186. && curl -fsSL https://static.rust-lang.org/dist$RUST_DATE/rust-$RUST_VERSION-$ARCH_GCC-unknown-linux-gnu.tar.gz > rust.tar.gz \
  187. && curl -fsSL https://static.rust-lang.org/dist$RUST_DATE/rust-$RUST_VERSION-$ARCH_GCC-unknown-linux-gnu.tar.gz.asc > rust.asc \
  188. && gpg --verify rust.asc rust.tar.gz \
  189. && tar -xzf rust.tar.gz -C rust --strip-components=1 \
  190. && rm -f rust.asc rust.tar.gz \
  191. && rust/install.sh --components=$RUST_COMPONENTS \
  192. && curl -fsSL https://static.rust-lang.org/dist$RUST_DATE/rustc-$RUST_VERSION-src.tar.gz > rust-src.tar.gz \
  193. && curl -fsSL https://static.rust-lang.org/dist$RUST_DATE/rustc-$RUST_VERSION-src.tar.gz.asc > rust-src.asc \
  194. && gpg --verify rust-src.asc rust-src.tar.gz \
  195. && mkdir -p /usr/local/lib/rustlib/src/rust \
  196. && tar -xzf rust-src.tar.gz -C /usr/local/lib/rustlib/src/rust --strip-components=1 \
  197. && rm -f rust-src.asc rust-src.tar.gz \
  198. && case $RUST_COMPONENTS in *miri*) \
  199. PATH=$PATH:/root/.cargo/bin cargo miri setup \
  200. ;; \
  201. esac \
  202. && curl -fsSL https://static.rust-lang.org/dist$RUST_DATE/rust-std-$RUST_VERSION-wasm32-unknown-unknown.tar.gz > rust.tar.gz \
  203. && curl -fsSL https://static.rust-lang.org/dist$RUST_DATE/rust-std-$RUST_VERSION-wasm32-unknown-unknown.tar.gz.asc > rust.asc \
  204. && gpg --verify rust.asc rust.tar.gz \
  205. && tar -xzf rust.tar.gz -C /usr/local/lib/rustlib/ --strip-components=4 \
  206. && rm -rf rust.asc rust.tar.gz rust \
  207. && cargo install --root /usr/local --version "=0.7.1" --locked cargo-about \
  208. && cargo install --root /usr/local --version "=3.2.0" --locked cargo-deb \
  209. && cargo install --root /usr/local --version "=0.18.3" --locked cargo-deny \
  210. && cargo install --root /usr/local --version "=0.1.0" --locked cargo-deplint \
  211. && cargo install --root /usr/local --version "=0.9.36" --locked cargo-hakari \
  212. && cargo install --root /usr/local --version "=0.9.100" --locked cargo-nextest \
  213. && cargo install --root /usr/local --version "=0.6.17" --locked cargo-llvm-cov \
  214. && cargo install --root /usr/local --version "=0.1.57" --locked --features=vendored-openssl cargo-udeps \
  215. && cargo install --root /usr/local --version "=0.10.0" --locked --no-default-features --features=s3,openssl/vendored sccache \
  216. && cargo install --root /usr/local --version "=0.3.6" --locked cargo-binutils \
  217. && cargo install --root /usr/local --version "=0.13.1" --locked wasm-pack
  218. # Shims for sanitizers
  219. COPY sanshim/$ARCH_GCC /sanshim
  220. # Install the locked version of our typechecker -- it'll be invoked via `npx`,
  221. # so using the same command here should ensure it's installed and cached in the
  222. # right place
  223. COPY pyright-version.sh /workdir/
  224. RUN npx pyright@$(sh /workdir/pyright-version.sh) --help
  225. # Install APT repo generator.
  226. RUN curl -fsSL https://github.com/deb-s3/deb-s3/releases/download/0.11.3/deb-s3-0.11.3.gem > deb-s3.gem \
  227. && gem install ./deb-s3.gem \
  228. && rm deb-s3.gem
  229. # Install the AWS CLI.
  230. RUN curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-$ARCH_GCC-2.17.2.zip" > awscli.zip \
  231. && unzip awscli.zip \
  232. && ./aws/install \
  233. && rm -rf aws awscli.zip
  234. # Install the gcloud CLI.
  235. RUN arch_gcloud=$(echo "$ARCH_GCC" | sed -e "s/aarch64/arm/" -e "s/amd64/x86_64/") \
  236. && curl -fsSL "https://storage.googleapis.com/cloud-sdk-release/google-cloud-cli-507.0.0-linux-$arch_gcloud.tar.gz" > gcloud.tar.gz \
  237. && tar -xzf gcloud.tar.gz -C /opt \
  238. && rm gcloud.tar.gz \
  239. && CLOUDSDK_CORE_DISABLE_PROMPTS=1 /opt/google-cloud-sdk/install.sh --path-update false \
  240. && /opt/google-cloud-sdk/bin/gcloud config set disable_usage_reporting false \
  241. && /opt/google-cloud-sdk/bin/gcloud components install gke-gcloud-auth-plugin
  242. # Install docs site dependencies. These are towards the end for the same reason
  243. # as the Python dependencies. These are only supported on x86_64 at the moment.
  244. # See: https://discourse.gohugo.io/t/how-to-install-hugo-extended-on-linux-arm/28098/4
  245. RUN if [ $ARCH_GCC = x86_64 ]; then \
  246. curl -fsSL https://github.com/wjdp/htmltest/releases/download/v0.12.1/htmltest_0.12.1_linux_amd64.tar.gz > htmltest.tar.gz \
  247. && echo '04d4be5097b98cd28de469f8856b3fbe82669f57b482a4cf3092a55e9e8e9e0d htmltest.tar.gz' | sha256sum --check \
  248. && tar -xzf htmltest.tar.gz -C /usr/local/bin htmltest \
  249. && rm htmltest.tar.gz \
  250. && curl -fsSL https://github.com/gohugoio/hugo/releases/download/v0.128.0/hugo_extended_0.128.0_Linux-64bit.tar.gz > hugo.tar.gz \
  251. && echo 'a39cd72eff188f8596f09f3a7db9195477c4ce21072d286832f9fde15ba5d336 hugo.tar.gz' | sha256sum --check \
  252. && tar -xzf hugo.tar.gz -C /usr/local/bin hugo \
  253. && rm hugo.tar.gz; \
  254. fi
  255. # Install KinD, kubectl, helm & helm-docs
  256. RUN curl -fsSL https://kind.sigs.k8s.io/dl/v0.29.0/kind-linux-$ARCH_GO > /usr/local/bin/kind \
  257. && chmod +x /usr/local/bin/kind \
  258. && if [ $ARCH_GO = amd64 ]; then echo 'c72eda46430f065fb45c5f70e7c957cc9209402ef309294821978677c8fb3284 /usr/local/bin/kind' | sha256sum --check; fi \
  259. && if [ $ARCH_GO = arm64 ]; then echo '03d45095dbd9cc1689f179a3e5e5da24b77c2d1b257d7645abf1b4174bebcf2a /usr/local/bin/kind' | sha256sum --check; fi
  260. RUN curl -fsSL https://dl.k8s.io/release/v1.24.3/bin/linux/$ARCH_GO/kubectl > /usr/local/bin/kubectl \
  261. && chmod +x /usr/local/bin/kubectl \
  262. && if [ $ARCH_GO = amd64 ]; then echo '8a45348bdaf81d46caf1706c8bf95b3f431150554f47d444ffde89e8cdd712c1 /usr/local/bin/kubectl' | sha256sum --check; fi \
  263. && if [ $ARCH_GO = arm64 ]; then echo 'bdad4d3063ddb7bfa5ecf17fb8b029d5d81d7d4ea1650e4369aafa13ed97149a /usr/local/bin/kubectl' | sha256sum --check; fi
  264. RUN curl -fsSL https://get.helm.sh/helm-v3.16.2-linux-$ARCH_GO.tar.gz > helm.tar.gz \
  265. && if [ $ARCH_GO = amd64 ]; then echo '9318379b847e333460d33d291d4c088156299a26cd93d570a7f5d0c36e50b5bb helm.tar.gz' | sha256sum --check; fi \
  266. && if [ $ARCH_GO = arm64 ]; then echo '1888301aeb7d08a03b6d9f4d2b73dcd09b89c41577e80e3455c113629fc657a4 helm.tar.gz' | sha256sum --check; fi \
  267. && tar -xf helm.tar.gz -C /usr/local/bin --strip-components=1 linux-$ARCH_GO/helm \
  268. && rm helm.tar.gz
  269. RUN arch_helm_docs=$(echo "$ARCH_GCC" | sed -e "s/aarch64/arm64/" -e "s/amd64/x86_64/") \
  270. && curl -fsSL https://github.com/norwoodj/helm-docs/releases/download/v1.14.2/helm-docs_1.14.2_Linux_$arch_helm_docs.tar.gz > helm-docs.tar.gz \
  271. && if [ "$arch_helm_docs" = "x86_64" ]; then echo 'a8cf72ada34fad93285ba2a452b38bdc5bd52cc9a571236244ec31022928d6cc helm-docs.tar.gz' | sha256sum --check; fi \
  272. && if [ "$arch_helm_docs" = "arm64" ]; then echo 'c3787212332386dcd122debef7848feb165aa701467ae3e3442df7638f3ac4e4 helm-docs.tar.gz' | sha256sum --check; fi \
  273. && tar -xf helm-docs.tar.gz -C /usr/local/bin \
  274. && rm helm-docs.tar.gz
  275. RUN mkdir -p /usr/local/share/helm/plugins/unittest \
  276. && curl -fsSL https://github.com/helm-unittest/helm-unittest/releases/download/v0.6.3/helm-unittest-linux-$ARCH_GO-0.6.3.tgz > helm-unittest.tar.gz \
  277. && if [ $ARCH_GO = amd64 ]; then echo '46a23e9788cfb9f4853af9f1f8e461f5795ef6ef2917cf82df2a25bf30a65064 helm-unittest.tar.gz' | sha256sum --check; fi \
  278. && if [ $ARCH_GO = arm64 ]; then echo 'cca780834c6c59dda2cbccd97002d2a5c330347b4b87dc39ad13f41a345a0401 helm-unittest.tar.gz' | sha256sum --check; fi \
  279. && tar -xf helm-unittest.tar.gz -C /usr/local/share/helm/plugins/unittest \
  280. && rm helm-unittest.tar.gz
  281. RUN curl -fsSL https://releases.hashicorp.com/terraform/1.9.8/terraform_1.9.8_linux_$ARCH_GO.zip > terraform.zip \
  282. && if [ $ARCH_GO = amd64 ]; then echo '186e0145f5e5f2eb97cbd785bc78f21bae4ef15119349f6ad4fa535b83b10df8 terraform.zip' | sha256sum --check; fi \
  283. && if [ $ARCH_GO = arm64 ]; then echo 'f85868798834558239f6148834884008f2722548f84034c9b0f62934b2d73ebb terraform.zip' | sha256sum --check; fi \
  284. && unzip terraform.zip terraform -d /usr/local/bin \
  285. && chmod +x /usr/local/bin/terraform \
  286. && rm terraform.zip
  287. RUN curl -fsSL https://github.com/terraform-docs/terraform-docs/releases/download/v0.20.0/terraform-docs-v0.20.0-linux-$ARCH_GO.tar.gz > terraform-docs.tar.gz \
  288. && if [ $ARCH_GO = amd64 ]; then echo '34ae01772412bb11474e6718ea62113e38ff5964ee570a98c69fafe3a6dff286 terraform-docs.tar.gz' | sha256sum --check; fi \
  289. && if [ $ARCH_GO = arm64 ]; then echo '371b4ed983781d1efdd8f7de06264baac41b1d80927f7fd718c405a303d863a0 terraform-docs.tar.gz' | sha256sum --check; fi \
  290. && tar -xzf terraform-docs.tar.gz -C /usr/local/bin terraform-docs \
  291. && rm terraform-docs.tar.gz
  292. RUN curl -fsSL https://github.com/mikefarah/yq/releases/download/v4.45.1/yq_linux_$ARCH_GO > yq \
  293. && if [ $ARCH_GO = amd64 ]; then echo '654d2943ca1d3be2024089eb4f270f4070f491a0610481d128509b2834870049 yq' | sha256sum --check; fi \
  294. && if [ $ARCH_GO = arm64 ]; then echo 'ceea73d4c86f2e5c91926ee0639157121f5360da42beeb8357783d79c2cc6a1d yq' | sha256sum --check; fi \
  295. && chmod +x yq \
  296. && mv yq /usr/local/bin
  297. # Hardcode some known SSH hosts, or else SSH will ask whether the host is
  298. # trustworthy on the first connection.
  299. COPY ssh_known_hosts /etc/ssh/ssh_known_hosts
  300. ENV LDFLAGS="-fuse-ld=lld -static-libstdc++"
  301. ENV RUSTFLAGS="-Clink-arg=-Wl,--compress-debug-sections=zlib -Clink-arg=-Wl,-O3 -Clink-arg=-fuse-ld=lld -Csymbol-mangling-version=v0 --cfg=tokio_unstable"
  302. ENV PATH=/opt/google-cloud-sdk/bin:$PATH
  303. ENV CARGO_TARGET_DIR=/mnt/build
  304. ENV CARGO_INCREMENTAL=1
  305. ENV HELM_PLUGINS=/usr/local/share/helm/plugins
  306. # Set up for a persistent volume to hold Cargo metadata, so that crate metadata
  307. # does not need to be refetched on every compile.
  308. ENV CARGO_HOME=/cargo
  309. RUN mkdir /cargo && chmod 777 /cargo
  310. VOLUME /cargo