@@ -37,6 +37,20 @@ ARG ENVOY_VERSION=1.38.2
3737# manylinux-builder container.
3838ARG CLANG_VERSION=20
3939
40+ # Raw `curl` and `wget` downloads in this file retry transient
41+ # failures: `curl --retry 5 --retry-all-errors -f` (plain `--retry`
42+ # does not retry connection resets, hence `--retry-all-errors`, and
43+ # `-f`/`--fail` turns an HTTP error status into a failed download
44+ # rather than writing the error body to the output file) and `wget
45+ # --tries=5 --waitretry=10 --retry-connrefused`. Installer scripts
46+ # are downloaded to a temporary file and executed from it rather than
47+ # piped straight into an interpreter, because on a retry after a
48+ # mid-body failure curl re-sends the whole body into the
49+ # already-written pipe, corrupting the stream. Pipes into key-material
50+ # consumers like `apt-key` and `gpg --dearmor` keep the pipe: their
51+ # input is validated cryptographically, so a torn stream fails the
52+ # build loudly.
53+
4054# ##############################################################################
4155# Use a specific ubuntu version so we're not surprised by silent changes to gcc
4256# versions (and thus C++ feature support). We additionally care about the `glibc`
@@ -77,7 +91,10 @@ RUN update-alternatives --install /usr/bin/python usr-bin-python /usr/bin/python
7791 && python --version | grep -Eq "^Python ${PYTHON_VERSION}.*"
7892
7993# Ensure pip is installed and up to date.
80- RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python \
94+ RUN curl --retry 5 --retry-all-errors -fsS https://bootstrap.pypa.io/get-pip.py \
95+ -o /tmp/get-pip.py \
96+ && python /tmp/get-pip.py \
97+ && rm /tmp/get-pip.py \
8198 && update-alternatives --install /usr/local/bin/pip pip /usr/local/bin/pip3 3
8299
83100ENV TINI_VERSION=v0.19.0
@@ -99,7 +116,7 @@ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-ins
99116# https://github.com/fullstorydev/grpcurl
100117ARG GRPCURL_VERSION=1.9.2
101118RUN if [ "${TARGETARCH}" = "amd64" ]; then \
102- wget https://github.com/fullstorydev/grpcurl/releases/download/v${GRPCURL_VERSION}/grpcurl_${GRPCURL_VERSION}_linux_x86_64.tar.gz \
119+ wget --tries=5 --waitretry=10 --retry-connrefused https://github.com/fullstorydev/grpcurl/releases/download/v${GRPCURL_VERSION}/grpcurl_${GRPCURL_VERSION}_linux_x86_64.tar.gz \
103120 && tar -xvf ./grpcurl_${GRPCURL_VERSION}_linux_x86_64.tar.gz grpcurl \
104121 && rm ./grpcurl_${GRPCURL_VERSION}_linux_x86_64.tar.gz \
105122 && chmod +x grpcurl \
@@ -209,7 +226,7 @@ RUN apt-get update \
209226 zsh \
210227 # Install clang. Instructions:
211228 # https://apt.llvm.org/
212- && wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - \
229+ && wget --tries=5 --waitretry=10 --retry-connrefused - O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - \
213230 && add-apt-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-${CLANG_VERSION} main" \
214231 && apt-get update \
215232 && apt install -y clang-${CLANG_VERSION} \
@@ -225,7 +242,7 @@ RUN apt-get update \
225242 # Install Docker from the official Docker repository. Instructions:
226243 # https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
227244 && install -m 0755 -d /etc/apt/keyrings \
228- && curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc \
245+ && curl --retry 5 --retry-all-errors - fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc \
229246 && chmod a+r /etc/apt/keyrings/docker.asc \
230247 && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo " ${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \
231248 && apt-get update \
@@ -236,13 +253,16 @@ RUN apt-get update \
236253
237254# Install Bazel.
238255ARG BAZELISK_VERSION=v1.27.0
239- RUN wget -O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/download/${BAZELISK_VERSION}/bazelisk-linux-${TARGETARCH} \
256+ RUN wget --tries=5 --waitretry=10 --retry-connrefused - O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/download/${BAZELISK_VERSION}/bazelisk-linux-${TARGETARCH} \
240257 && chmod +x /usr/local/bin/bazel
241258
242259# Install k3d.io which we'll use to run integration tests.
243260# See https://k3d.io/v5.8.3/#install-specific-release
244261ARG K3D_VERSION=v5.8.3
245- RUN curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | TAG=${K3D_VERSION} bash
262+ RUN curl --retry 5 --retry-all-errors -fsS https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh \
263+ -o /tmp/k3d-install.sh \
264+ && TAG=${K3D_VERSION} bash /tmp/k3d-install.sh \
265+ && rm /tmp/k3d-install.sh
246266# The version of Kubernetes used by k3d is determined by the version of k3s it
247267# installs, which is determined by the version of k3d. Confirm that the expected
248268# Kubernetes version is indeed that k3d's default.
@@ -253,13 +273,16 @@ RUN k3d version | grep -q "k3s version ${KUBERNETES_VERSION}-k3s"
253273# (+/- 1 version) with the Kubernetes used by the k3d installation above.
254274# See https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/#install-kubectl-binary-with-curl-on-linux
255275ARG KUBECTL_VERSION=$KUBERNETES_VERSION
256- RUN curl -LO https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/linux/${TARGETARCH}/kubectl \
276+ RUN curl --retry 5 --retry-all-errors -fLO https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/linux/${TARGETARCH}/kubectl \
257277 && chmod +x kubectl \
258278 && mv kubectl /usr/local/bin/kubectl
259279
260280# Install Istio.
261281# See https://istio.io/latest/docs/setup/getting-started/
262- RUN curl -L https://istio.io/downloadIstio | ISTIO_VERSION=${ISTIO_VERSION} sh - \
282+ RUN curl --retry 5 --retry-all-errors -fL https://istio.io/downloadIstio \
283+ -o /tmp/downloadIstio \
284+ && ISTIO_VERSION=${ISTIO_VERSION} sh /tmp/downloadIstio \
285+ && rm /tmp/downloadIstio \
263286 && mv istio-${ISTIO_VERSION}/bin/istioctl /usr/local/bin/istioctl \
264287 && chmod +x /usr/local/bin/istioctl \
265288 && rm -rf istio-${ISTIO_VERSION}
@@ -268,7 +291,7 @@ RUN curl -L https://istio.io/downloadIstio | ISTIO_VERSION=${ISTIO_VERSION} sh -
268291# https://skaffold.dev/docs/install/
269292# Latest version as of 2023-04-17.
270293ARG SKAFFOLD_VERSION=2.3.1
271- RUN curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/v${SKAFFOLD_VERSION}/skaffold-linux-${TARGETARCH} \
294+ RUN curl --retry 5 --retry-all-errors -fLo skaffold https://storage.googleapis.com/skaffold/releases/v${SKAFFOLD_VERSION}/skaffold-linux-${TARGETARCH} \
272295 && chmod +x skaffold && mv skaffold /usr/local/bin/
273296
274297# Skaffold will call kustomize via the `kustomize build` command; however, we
@@ -290,14 +313,14 @@ RUN set -e; \
290313 else \
291314 echo "Unsupported arch: ${TARGETARCH}" && exit 1; \
292315 fi; \
293- curl -sL "https://github.com/google/go-containerregistry/releases/download/v${CRANE_VERSION}/go-containerregistry_linux_${ARCH_SUFFIX}.tar.gz" > go-containerregistry.tar.gz \
316+ curl --retry 5 --retry-all-errors -fsL "https://github.com/google/go-containerregistry/releases/download/v${CRANE_VERSION}/go-containerregistry_linux_${ARCH_SUFFIX}.tar.gz" -o go-containerregistry.tar.gz \
294317 && tar -zxvf go-containerregistry.tar.gz -C /usr/local/bin/ crane \
295318 && rm go-containerregistry.tar.gz
296319
297320# Install the Groundcover CLI based on instructions here:
298321# https://github.com/groundcover-com/cli#from-the-binary-releases
299322ARG GROUNDCOVER_VERSION=0.21.0
300- RUN curl -SsL https://github.com/groundcover-com/cli/releases/download/v${GROUNDCOVER_VERSION}/groundcover_${GROUNDCOVER_VERSION}_linux_${TARGETARCH}.tar.gz -o /tmp/groundcover.tar.gz \
323+ RUN curl --retry 5 --retry-all-errors -fSsL https://github.com/groundcover-com/cli/releases/download/v${GROUNDCOVER_VERSION}/groundcover_${GROUNDCOVER_VERSION}_linux_${TARGETARCH}.tar.gz -o /tmp/groundcover.tar.gz \
301324 && tar -zxf /tmp/groundcover.tar.gz -C /usr/bin \
302325 && chmod +x /usr/bin/groundcover
303326
@@ -312,13 +335,13 @@ RUN set -e; \
312335 echo "Unsupported arch: ${TARGETARCH}" && exit 1; \
313336 fi; \
314337 BINARY_NAME="envoy-${ENVOY_VERSION}-linux-${ARCH_SUFFIX}" ; \
315- wget https://github.com/envoyproxy/envoy/releases/download/v${ENVOY_VERSION}/${BINARY_NAME}; \
338+ wget --tries=5 --waitretry=10 --retry-connrefused https://github.com/envoyproxy/envoy/releases/download/v${ENVOY_VERSION}/${BINARY_NAME}; \
316339 chmod +x ${BINARY_NAME}; \
317340 mv ${BINARY_NAME} /usr/local/bin/envoy
318341
319342# Install `ngrok`, useful in testing MCP servers from non-local clients
320343# like `claude.ai` - or to intercept traffic for inspection.
321- RUN curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
344+ RUN curl --retry 5 --retry-all-errors -fsSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
322345 | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
323346 && echo "deb https://ngrok-agent.s3.amazonaws.com bookworm main" \
324347 | sudo tee /etc/apt/sources.list.d/ngrok.list \
@@ -360,7 +383,9 @@ ENV SHELL=/bin/bash \
360383ARG VSCODE_SCRIPTS_COMMIT=ef146121026c67d41bbca80d9af482f20f89f9e0
361384RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
362385 && apt-get -y install --no-install-recommends curl ca-certificates \
363- && bash -c "$(curl -fsSL " https://raw.githubusercontent.com/microsoft/vscode-dev-containers/${VSCODE_SCRIPTS_COMMIT}/script-library/common-debian.sh")" -- "true" "${UNAME}" "${UID}" "${GID}" "true" \
386+ && curl --retry 5 --retry-all-errors -fsSL "https://raw.githubusercontent.com/microsoft/vscode-dev-containers/${VSCODE_SCRIPTS_COMMIT}/script-library/common-debian.sh" -o /tmp/common-debian.sh \
387+ && bash /tmp/common-debian.sh "true" "${UNAME}" "${UID}" "${GID}" "true" \
388+ && rm /tmp/common-debian.sh \
364389 && apt-get clean -y && rm -rf /var/lib/apt/lists/*
365390
366391# Finish setting up user account:
@@ -376,7 +401,9 @@ CMD ["sleep", "infinity"]
376401# Install GitHub CLI through Codespace's preferred mechanism.
377402# https://github.com/microsoft/vscode-dev-containers/blob/main/script-library/docs/github-cli.md
378403RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
379- && bash -c "$(curl -fsSL " https://raw.githubusercontent.com/microsoft/vscode-dev-containers/main/script-library/github-debian.sh")" \
404+ && curl --retry 5 --retry-all-errors -fsSL "https://raw.githubusercontent.com/microsoft/vscode-dev-containers/main/script-library/github-debian.sh" -o /tmp/github-debian.sh \
405+ && bash /tmp/github-debian.sh \
406+ && rm /tmp/github-debian.sh \
380407 && rm -rf /var/lib/apt/lists/*
381408
382409# Ensure we have the most up to date version of the public key for
@@ -389,7 +416,7 @@ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
389416# TODO(benh): do we need this once/if the 'FROM' gets updated correctly?
390417#
391418# TODO(gorm,rjh): try out whether this is still needed.
392- RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
419+ RUN curl --retry 5 --retry-all-errors - fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
393420 && chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
394421 && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null
395422
@@ -398,7 +425,7 @@ RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | d
398425#
399426# We use the latest Buildifier version that matches our Bazel major version.
400427ARG BUILDIFIER_VERSION=6.4.0
401- RUN wget https://github.com/bazelbuild/buildtools/releases/download/v${BUILDIFIER_VERSION}/buildifier-linux-${TARGETARCH} \
428+ RUN wget --tries=5 --waitretry=10 --retry-connrefused https://github.com/bazelbuild/buildtools/releases/download/v${BUILDIFIER_VERSION}/buildifier-linux-${TARGETARCH} \
402429 && chmod +x ./buildifier-linux-${TARGETARCH} \
403430 && mv ./buildifier-linux-${TARGETARCH} /usr/local/bin/buildifier
404431
@@ -408,7 +435,7 @@ RUN wget https://github.com/bazelbuild/buildtools/releases/download/v${BUILDIFIE
408435ARG NODE_MAJOR=20
409436ARG NPM_VERSION=11.5.1
410437RUN mkdir -p /etc/apt/keyrings \
411- && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
438+ && curl --retry 5 --retry-all-errors - fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
412439 && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \
413440 && apt-get update \
414441 && DEBIAN_FRONTEND=noninteractive apt-get install -y nodejs \
@@ -450,7 +477,7 @@ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -yq fish \
450477# We need 'google-chrome-stable' for test purposes, we do not run tests on arm64
451478# (currently).
452479RUN if [ "${TARGETARCH}" = "amd64" ]; then \
453- wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
480+ wget --tries=5 --waitretry=10 --retry-connrefused - q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
454481 && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
455482 && apt-get update -qqy \
456483 && DEBIAN_FRONTEND=noninteractive apt-get install -qqy google-chrome-stable; \
@@ -468,15 +495,15 @@ RUN set -e; \
468495 else \
469496 echo "Unsupported arch: ${TARGETARCH}" && exit 1; \
470497 fi; \
471- curl "https://awscli.amazonaws.com/awscli-exe-linux-${ARCH_SUFFIX}.zip" -o "awscliv2.zip" \
498+ curl --retry 5 --retry-all-errors -f "https://awscli.amazonaws.com/awscli-exe-linux-${ARCH_SUFFIX}.zip" -o "awscliv2.zip" \
472499 && unzip awscliv2.zip \
473500 && ./aws/install \
474501 && rm awscliv2.zip
475502
476503# Install `aws-iam-authenticator`, which `kubectl` uses to authenticate with
477504# AWS.
478505ARG AWS_IAM_AUTHENTICATOR_VERSION=0.6.11
479- RUN curl -Lo aws-iam-authenticator https://github.com/kubernetes-sigs/aws-iam-authenticator/releases/download/v${AWS_IAM_AUTHENTICATOR_VERSION}/aws-iam-authenticator_${AWS_IAM_AUTHENTICATOR_VERSION}_linux_${TARGETARCH} \
506+ RUN curl --retry 5 --retry-all-errors -fLo aws-iam-authenticator https://github.com/kubernetes-sigs/aws-iam-authenticator/releases/download/v${AWS_IAM_AUTHENTICATOR_VERSION}/aws-iam-authenticator_${AWS_IAM_AUTHENTICATOR_VERSION}_linux_${TARGETARCH} \
480507 && chmod +x ./aws-iam-authenticator \
481508 && mv ./aws-iam-authenticator /usr/local/bin/
482509
@@ -494,7 +521,7 @@ RUN set -e; \
494521 echo "Unsupported arch: ${TARGETARCH}" && exit 1; \
495522 fi; \
496523 ARCHIVE_NAME="pulumi-v${PULUMI_VERSION}-linux-${ARCH_SUFFIX}.tar.gz" ; \
497- wget https://get.pulumi.com/releases/sdk/${ARCHIVE_NAME} \
524+ wget --tries=5 --waitretry=10 --retry-connrefused https://get.pulumi.com/releases/sdk/${ARCHIVE_NAME} \
498525 && tar -xvf ${ARCHIVE_NAME} \
499526 && mv ./pulumi/* /usr/local/bin/ \
500527 && rm ${ARCHIVE_NAME}
@@ -503,7 +530,10 @@ RUN set -e; \
503530# versions. (The latter is optional but enables the Python versions to be
504531# cached in the Docker image).
505532USER $UNAME
506- RUN curl -LsSf https://astral.sh/uv/0.11.13/install.sh | sh \
533+ RUN curl --retry 5 --retry-all-errors -LsSf https://astral.sh/uv/0.11.13/install.sh \
534+ -o /tmp/uv-install.sh \
535+ && sh /tmp/uv-install.sh \
536+ && rm /tmp/uv-install.sh \
507537 && "$HOME/.local/bin/uv" python install 3.10.13 3.11.8 3.12.2
508538
509539# Bazel's `--incompatible_strict_action_env` causes a hardcoded PATH to be used which
@@ -520,7 +550,10 @@ RUN echo "export PATH=\"$HOME/.local/bin:\$PATH\"" >> "$HOME/.bashrc"
520550# like `uv` above so non-interactive shells and other users find it too.
521551# It's a human-driven tool, so we don't pin the version and leave
522552# auto-update on.
523- RUN curl -fsSL https://claude.ai/install.sh | bash \
553+ RUN curl --retry 5 --retry-all-errors -fsSL https://claude.ai/install.sh \
554+ -o /tmp/claude-install.sh \
555+ && bash /tmp/claude-install.sh \
556+ && rm /tmp/claude-install.sh \
524557 && sudo ln -sf "$HOME/.local/bin/claude" /usr/local/bin/claude
525558
526559# Give Claude Code the headless Chrome DevTools MCP server in the user's
@@ -533,21 +566,24 @@ USER root
533566
534567# Install Helm.
535568ARG HELM_VERSION=3.15.4
536- RUN wget https://get.helm.sh/helm-v${HELM_VERSION}-linux-${TARGETARCH}.tar.gz \
569+ RUN wget --tries=5 --waitretry=10 --retry-connrefused https://get.helm.sh/helm-v${HELM_VERSION}-linux-${TARGETARCH}.tar.gz \
537570 && tar --to-stdout -xvf ./helm-v${HELM_VERSION}-linux-${TARGETARCH}.tar.gz linux-${TARGETARCH}/helm > /usr/local/bin/helm \
538571 && rm ./helm-v${HELM_VERSION}-linux-${TARGETARCH}.tar.gz \
539572 && chmod +x /usr/local/bin/helm
540573
541574# Install the Helm chart-testing tool.
542575ARG CHART_TESTING_VERSION=3.11.0
543- RUN wget https://github.com/helm/chart-testing/releases/download/v${CHART_TESTING_VERSION}/chart-testing_${CHART_TESTING_VERSION}_linux_${TARGETARCH}.tar.gz \
576+ RUN wget --tries=5 --waitretry=10 --retry-connrefused https://github.com/helm/chart-testing/releases/download/v${CHART_TESTING_VERSION}/chart-testing_${CHART_TESTING_VERSION}_linux_${TARGETARCH}.tar.gz \
544577 && tar --to-stdout -xvf ./chart-testing_${CHART_TESTING_VERSION}_linux_${TARGETARCH}.tar.gz ct > /usr/local/bin/ct \
545578 && rm ./chart-testing_${CHART_TESTING_VERSION}_linux_${TARGETARCH}.tar.gz \
546579 && chmod +x /usr/local/bin/ct
547580
548581# Install `pnpm` at a version compatible with our `aspect_rules_js`.
549582ARG PNPM_VERSION=8.15.8
550- RUN curl -fsSL https://get.pnpm.io/install.sh | env PNPM_VERSION=${PNPM_VERSION} sh -
583+ RUN curl --retry 5 --retry-all-errors -fsSL https://get.pnpm.io/install.sh \
584+ -o /tmp/pnpm-install.sh \
585+ && env PNPM_VERSION=${PNPM_VERSION} sh /tmp/pnpm-install.sh \
586+ && rm /tmp/pnpm-install.sh
551587
552588# Install additional npm packages: `corepack` in order to get `yarn`, and the
553589# Firebase CLI.
@@ -568,7 +604,7 @@ RUN set -e; \
568604 TMPDIR="$(mktemp -d)" \
569605 && cd "${TMPDIR}" \
570606 && KREW="krew-linux_${TARGETARCH}" \
571- && curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/download/${KREW_VERSION}/${KREW}.tar.gz" \
607+ && curl --retry 5 --retry-all-errors - fsSLO "https://github.com/kubernetes-sigs/krew/releases/download/${KREW_VERSION}/${KREW}.tar.gz" \
572608 && tar zxf "${KREW}.tar.gz" \
573609 && ./"${KREW}" install krew \
574610 && ln -s "${KREW_ROOT}/bin/kubectl-krew" /usr/local/bin/kubectl-krew \
@@ -652,7 +688,9 @@ RUN if [ "${TARGETARCH}" = "amd64" ]; then \
652688# above). Only on amd64, matching the SDK install above.
653689USER $UNAME
654690RUN if [ "${TARGETARCH}" = "amd64" ]; then \
655- curl -fsSL "https://get.maestro.mobile.dev" | bash; \
691+ curl --retry 5 --retry-all-errors -fsSL "https://get.maestro.mobile.dev" -o /tmp/maestro-install.sh \
692+ && bash /tmp/maestro-install.sh \
693+ && rm /tmp/maestro-install.sh; \
656694 fi
657695USER root
658696
@@ -777,7 +815,7 @@ RUN set -e; \
777815 else \
778816 echo "Unsupported arch: ${TARGETARCH}" && exit 1; \
779817 fi; \
780- wget -O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/download/${BAZELISK_VERSION}/bazelisk-linux-${ARCH_SUFFIX} \
818+ wget --tries=5 --waitretry=10 --retry-connrefused - O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/download/${BAZELISK_VERSION}/bazelisk-linux-${ARCH_SUFFIX} \
781819 && chmod +x /usr/local/bin/bazel
782820
783821# Install Python build dependencies.
@@ -824,7 +862,7 @@ RUN set -e; \
824862 echo "Unsupported arch: ${TARGETARCH}" && exit 1; \
825863 fi; \
826864 BINARY_NAME="envoy-${ENVOY_VERSION}-linux-${ARCH_SUFFIX}" ; \
827- wget https://github.com/envoyproxy/envoy/releases/download/v${ENVOY_VERSION}/${BINARY_NAME}; \
865+ wget --tries=5 --waitretry=10 --retry-connrefused https://github.com/envoyproxy/envoy/releases/download/v${ENVOY_VERSION}/${BINARY_NAME}; \
828866 chmod +x ${BINARY_NAME}; \
829867 mv ${BINARY_NAME} /usr/local/bin/envoy
830868
@@ -834,7 +872,10 @@ RUN dnf install -y nodejs && dnf clean all
834872# Install uv for the builder user. We create a symlink in /usr/local/bin
835873# so it's accessible on the PATH regardless of the user.
836874USER builder
837- RUN curl -LsSf https://astral.sh/uv/0.11.13/install.sh | sh
875+ RUN curl --retry 5 --retry-all-errors -LsSf https://astral.sh/uv/0.11.13/install.sh \
876+ -o /tmp/uv-install.sh \
877+ && sh /tmp/uv-install.sh \
878+ && rm /tmp/uv-install.sh
838879
839880USER root
840881RUN ln -sf /home/builder/.local/bin/uv /usr/local/bin/uv
0 commit comments