diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6bc04926af3..42e863df11a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -81,16 +81,49 @@ build-job: - mkdir -p ~/.docker/cli-plugins/ ; curl -L https://github.com/docker/buildx/releases/download/v0.5.1/buildx-v0.5.1.linux-amd64 > ~/.docker/cli-plugins/docker-buildx ; chmod u+x ~/.docker/cli-plugins/docker-buildx # Connect to the Kubernetes-based builder "buildkit" # See vgci/buildkit-deployment.yml - - docker buildx create --use --name=buildkit --platform=linux/amd64 --node=buildkit-amd64 --driver=kubernetes --driver-opt="nodeselector=kubernetes.io/arch=amd64" + - docker buildx create --use --name=buildkit --platform=linux/amd64,linux/arm64 --node=buildkit-amd64 --driver=kubernetes --driver-opt="nodeselector=kubernetes.io/arch=amd64" + # Prune down build cache to make space + - docker buildx prune --keep-storage 80G # Connect so we can upload our images - docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY}" script: - make include/vg_git_version.hpp - - docker buildx build --push --build-arg THREADS=8 -t "quay.io/vgteam/vg:ci-${CI_PIPELINE_IID}-${CI_COMMIT_SHA}" -f Dockerfile . + - docker buildx build --platform=linux/amd64 --build-arg THREADS=8 --target run --push -t "quay.io/vgteam/vg:ci-${CI_PIPELINE_IID}-${CI_COMMIT_SHA}" -f Dockerfile . + # Also run the tests + - docker buildx build --platform=linux/amd64 --build-arg THREADS=8 --target test -f Dockerfile . variables: GIT_SUBMODULE_STRATEGY: recursive - -# We define a second follow-on phase to run the tests + +# The arm container build takes like 90 minutes, so we don't want to run it +# before the main test phase where the other long tests live. +# They also don't pass yet. +arm-build-job: + stage: test + only: + - /^arm/ + before_script: + # Don't bother starting the Docker daemon or installing much + - which docker || (sudo apt-get -q -y update && sudo apt-get -q -y install --no-upgrade docker.io) + # Get buildx + - mkdir -p ~/.docker/cli-plugins/ ; curl -L https://github.com/docker/buildx/releases/download/v0.5.1/buildx-v0.5.1.linux-amd64 > ~/.docker/cli-plugins/docker-buildx ; chmod u+x ~/.docker/cli-plugins/docker-buildx + # Connect to the Kubernetes-based builder "buildkit" + # See vgci/buildkit-deployment.yml + - docker buildx create --use --name=buildkit --platform=linux/amd64,linux/arm64 --node=buildkit-amd64 --driver=kubernetes --driver-opt="nodeselector=kubernetes.io/arch=amd64" + # Prune down build cache to make space + - docker buildx prune --keep-storage 80G + # Connect so we can upload our images + - docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY}" + script: + - make include/vg_git_version.hpp + # Build the arm container (emulated!) + - docker buildx build --platform=linux/arm64 --build-arg THREADS=8 --target run --push -t "quay.io/vgteam/vg:ci-${CI_PIPELINE_IID}-${CI_COMMIT_SHA}" -f Dockerfile . + # Also run the tests (emulated!) + # But don't fail if they fail yet, because they don't yet actually work. + - docker buildx build --platform=linux/arm64 --build-arg THREADS=8 --target test -f Dockerfile . || true + variables: + GIT_SUBMODULE_STRATEGY: recursive + +# We also run the toil-vg/pytest-based tests # Note that WE ONLY RUN TESTS LISTED IN vgci/test-list.txt test-job: stage: test diff --git a/.gitmodules b/.gitmodules index 94952bf4c06..9818068ee35 100644 --- a/.gitmodules +++ b/.gitmodules @@ -54,7 +54,7 @@ url = https://github.com/benedictpaten/sonLib.git [submodule "deps/fermi-lite"] path = deps/fermi-lite - url = https://github.com/edawson/fermi-lite.git + url = https://github.com/vgteam/fermi-lite.git [submodule "deps/gbwt"] path = deps/gbwt url = https://github.com/jltsiren/gbwt.git @@ -116,6 +116,9 @@ [submodule "vgteam_bbhash"] path = deps/BBHash url = https://github.com/vgteam/BBHash.git +[submodule "src/simde"] + path = src/simde + url = https://github.com/nemequ/simde-no-tests [submodule "doc/wiki"] path = doc/wiki url = https://github.com/vgteam/vg.wiki.git diff --git a/Dockerfile b/Dockerfile index 459267e6d67..651c7235dba 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Multi-container Dockerfile for build and run containers for vg -FROM ubuntu:18.04 AS base +FROM ubuntu:20.04 AS base MAINTAINER vgteam RUN echo base > /stage.txt @@ -12,6 +12,7 @@ ENV DEBCONF_NONINTERACTIVE_SEEN true FROM base AS build ARG THREADS=8 +ARG TARGETARCH RUN echo build > /stage.txt @@ -36,28 +37,35 @@ RUN apt-get -qq -y update && apt-get -qq -y upgrade && apt-get -qq -y install \ libcairo2-dev libpixman-1-dev libffi-dev libcairo-dev libprotobuf-dev libboost-all-dev ###DEPS_END### -# Pre-build non-package dependencies +# Prepare to build submodule dependencies COPY source_me.sh /vg/source_me.sh COPY deps /vg/deps -# To increase portability of the docker image, set the target CPU architecture to -# Nehalem (2008) rather than auto-detecting the build machine's CPU. -# This has no AVX1, AVX2, or PCLMUL, but it does have SSE4.2. -# UCSC has a Nehalem machine that we want to support. -RUN sed -i s/march=native/march=nehalem/ deps/sdsl-lite/CMakeLists.txt +# To increase portability of the docker image, when building for amd64, set the +# target CPU architecture to Nehalem (2008) rather than auto-detecting the +# build machine's CPU. This has no AVX1, AVX2, or PCLMUL, but it does have +# SSE4.2. UCSC has a Nehalem machine that we want to support. +RUN if [ -z "${TARGETARCH}" ] || [ "${TARGETARCH}" = "amd64" ] ; then sed -i s/march=native/march=nehalem/ deps/sdsl-lite/CMakeLists.txt; fi +# Clear any CMake caches in case we are building from someone's checkout +RUN find . -name CMakeCache.txt | xargs rm -f +# Build the dependencies COPY Makefile /vg/Makefile -RUN . ./source_me.sh && CXXFLAGS=" -march=nehalem " make -j $((THREADS < $(nproc) ? THREADS : $(nproc))) deps +RUN . ./source_me.sh && CXXFLAGS="$(if [ -z "${TARGETARCH}" ] || [ "${TARGETARCH}" = "amd64" ] ; then echo " -march=nehalem "; fi)" make -j $((THREADS < $(nproc) ? THREADS : $(nproc))) deps -# Bring in the rest of the build tree that we need +# Bring in the sources, which we need in order to build COPY src /vg/src -COPY test /vg/test -COPY doc /vg/doc -COPY scripts /vg/scripts + +# Build all the object files for vg, but don't link. +# Also pass the arch here +RUN . ./source_me.sh && CXXFLAGS="$(if [ -z "${TARGETARCH}" ] || [ "${TARGETARCH}" = "amd64" ] ; then echo " -march=nehalem "; fi)" make -j $((THREADS < $(nproc) ? THREADS : $(nproc))) objs + # Bring in any includes we pre-made, like the git version COPY include /vg/include -# Do the build. Trim down the resulting binary but make sure to include enough debug info for profiling. -# Also pass the arch here -RUN . ./source_me.sh && CXXFLAGS=" -march=nehalem " make -j $((THREADS < $(nproc) ? THREADS : $(nproc))) static && strip -d bin/vg +# Do the final build and link, knowing the version. Trim down the resulting binary but make sure to include enough debug info for profiling. +RUN . ./source_me.sh && CXXFLAGS="$(if [ -z "${TARGETARCH}" ] || [ "${TARGETARCH}" = "amd64" ] ; then echo " -march=nehalem "; fi)" make -j $((THREADS < $(nproc) ? THREADS : $(nproc))) static && strip -d bin/vg + +# Ship the scripts +COPY scripts /vg/scripts ENV PATH /vg/bin:$PATH @@ -69,8 +77,16 @@ RUN echo test > /stage.txt # Fail if any non-portable instructions were used RUN /bin/bash -e -c 'if objdump -d /vg/bin/vg | grep vperm2i128 ; then exit 1 ; else exit 0 ; fi' + +# Bring in the tests and docs, which have doctests +COPY test /vg/test +COPY doc /vg/doc +# We test the README so bring it along. +COPY README.md /vg/ + # Run tests in the middle so the final container that gets tagged is the run container. -RUN export OMP_NUM_THREADS=$((THREADS < $(nproc) ? THREADS : $(nproc))) make test +# Tests may not actually be run by smart builders like buildkit. +RUN /bin/bash -e -c "export OMP_NUM_THREADS=$((THREADS < $(nproc) ? THREADS : $(nproc))); make test" ############################################################################################ @@ -98,7 +114,6 @@ RUN ls -lah /vg && \ fontconfig-config \ awscli \ binutils \ - libssl1.0.0 \ libpython2.7 \ libperl-dev \ libelf1 \ @@ -116,7 +131,7 @@ COPY --from=build /vg/bin/vg /vg/bin/ COPY --from=build /vg/scripts/* /vg/scripts/ # Make sure we have the flame graph scripts so we can do self-profiling -COPY deps/FlameGraph /vg/deps/FlameGraph +COPY --from=build /vg/deps/FlameGraph /vg/deps/FlameGraph ENV PATH /vg/bin:$PATH diff --git a/Makefile b/Makefile index c1b57ea1a50..21b35e73e41 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,8 @@ CWD:=$(shell pwd) CXX ?= g++ PKG_CONFIG ?= pkg-config -EXE:=vg +SFX := +EXE:=vg$(SFX) all: $(BIN_DIR)/$(EXE) @@ -181,9 +182,11 @@ else # We get OpenMP the normal way, using whatever the compiler knows about CXXFLAGS += -fopenmp - # We care about building for SSE4.2 only and not AVX, to have vaguely portable binaries - CXXFLAGS += -msse4.2 - + ifeq ($(shell arch), x86_64) + # We care about building for SSE4.2 only and not AVX, to have vaguely portable binaries + CXXFLAGS += -msse4.2 + endif + # Note shared libraries are so files SHARED_SUFFIX = so # Define options to start static linking of libraries on GNU ld. @@ -355,10 +358,21 @@ ifneq ($(shell uname -s),Darwin) LD_LIB_FLAGS += -ljemalloc endif -.PHONY: clean get-deps deps test set-path static static-docker docs man .pre-build .check-environment .check-git .no-git +.PHONY: clean get-deps deps test set-path objs static static-docker docs man .pre-build .check-environment .check-git .no-git + +# Aggregate all libvg deps, and exe deps other than libvg +LIBVG_DEPS = $(OBJ) $(ALGORITHMS_OBJ) $(IO_OBJ) $(DEP_OBJ) $(DEPS) +EXE_DEPS = $(OBJ_DIR)/main.o $(UNITTEST_OBJ) $(SUBCOMMAND_OBJ) $(CONFIGURATION_OBJ) $(DEPS) $(LINK_DEPS) + +# We have a target we can build to do everything but link the library and executable +objs: $(LIBVG_DEPS) $(EXE_DEPS) + +$(LIB_DIR)/libvg.a: $(LIBVG_DEPS) + rm -f $@ + ar rs $@ $(OBJ) $(ALGORITHMS_OBJ) $(IO_OBJ) $(DEP_OBJ) # For a normal dynamic build we remove the static build marker -$(BIN_DIR)/$(EXE): $(OBJ_DIR)/main.o $(LIB_DIR)/libvg.a $(UNITTEST_OBJ) $(SUBCOMMAND_OBJ) $(CONFIGURATION_OBJ) $(DEPS) $(LINK_DEPS) +$(BIN_DIR)/$(EXE): $(LIB_DIR)/libvg.a $(EXE_DEPS) -rm -f $(LIB_DIR)/vg_is_static . ./source_me.sh && $(CXX) $(LDFLAGS) $(INCLUDE_FLAGS) $(CPPFLAGS) $(CXXFLAGS) -o $(BIN_DIR)/$(EXE) $(OBJ_DIR)/main.o $(UNITTEST_OBJ) $(SUBCOMMAND_OBJ) $(CONFIGURATION_OBJ) -lvg $(LD_LIB_DIR_FLAGS) $(LD_LIB_FLAGS) $(START_STATIC) $(LD_STATIC_LIB_FLAGS) $(END_STATIC) $(LD_STATIC_LIB_DEPS) # We keep a file that we touch on the last static build. @@ -379,10 +393,6 @@ static-docker: static scripts/* strip -d $(BIN_DIR)/$(EXE) DOCKER_BUILDKIT=1 docker build . -f Dockerfile.static -t vg -$(LIB_DIR)/libvg.a: $(OBJ) $(ALGORITHMS_OBJ) $(IO_OBJ) $(DEP_OBJ) $(DEPS) - rm -f $@ - ar rs $@ $(OBJ) $(ALGORITHMS_OBJ) $(IO_OBJ) $(DEP_OBJ) - # We have system-level deps to install # We want the One True Place for them to be in the Dockerfile. get-deps: diff --git a/README.md b/README.md index fa69f91b742..5b916a70bf0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # vg -[![Join the chat at https://gitter.im/vgteam/vg](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/vgteam/vg?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Latest Release](https://img.shields.io/github/release/vgteam/vg.svg)](https://github.com/vgteam/vg/releases/latest) [![Build Status](https://travis-ci.org/vgteam/vg.svg?branch=master)](https://travis-ci.org/vgteam/vg) [![Performance Report](https://img.shields.io/badge/performance-report-brightgreen.svg)](https://vg-data.s3.amazonaws.com/vg_ci/vgci_reports/branch/master/index.html) +[![Join the chat at https://gitter.im/vgteam/vg](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/vgteam/vg?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Latest Release](https://img.shields.io/github/release/vgteam/vg.svg)](https://github.com/vgteam/vg/releases/latest) [![Performance Report](https://img.shields.io/badge/performance-report-brightgreen.svg)](https://vg-data.s3.amazonaws.com/vg_ci/vgci_reports/branch/master/index.html) [![Doxygen API Documentation](https://img.shields.io/badge/doxygen-docs-brightgreen.svg)](https://vgteam.github.io/vg/) ## variation graph data structures, interchange formats, alignment, genotyping, and variant calling methods @@ -70,7 +70,7 @@ At present, you will need GCC version 4.9 or greater, with support for C++14, to Other libraries may be required. Please report any build difficulties. -Note that a 64-bit OS is required. Ubuntu 18.04 should work. You will also need a CPU that supports SSE 4.2 to run VG; you can check this with `cat /proc/cpuinfo | grep sse4_2`. +Note that a 64-bit OS is required. Ubuntu 18.04 should work. When you are ready, build with `. ./source_me.sh && make`, and run with `./bin/vg`. diff --git a/deps/fermi-lite b/deps/fermi-lite index cde7871d5a6..62faee92e49 160000 --- a/deps/fermi-lite +++ b/deps/fermi-lite @@ -1 +1 @@ -Subproject commit cde7871d5a6658be61a7c3995a56ac21fbacf4f4 +Subproject commit 62faee92e49f1724a354088cd3fdddfd90829b28 diff --git a/deps/gssw b/deps/gssw index 2f219159817..e17bad23ab6 160000 --- a/deps/gssw +++ b/deps/gssw @@ -1 +1 @@ -Subproject commit 2f219159817bbe6848feec3f51fbe373742c7abf +Subproject commit e17bad23ab68cfa9b8668b8298187d0b308b6129 diff --git a/deps/ssw b/deps/ssw index d27667cbb93..f53d459841b 160000 --- a/deps/ssw +++ b/deps/ssw @@ -1 +1 @@ -Subproject commit d27667cbb93bab73de3c31bf0a265fd8e8632e72 +Subproject commit f53d459841b632ac6ab0e59e1a0ef6d056034631 diff --git a/src/crash.cpp b/src/crash.cpp index 0ac22c582db..b4627d89584 100644 --- a/src/crash.cpp +++ b/src/crash.cpp @@ -168,7 +168,7 @@ void emit_stacktrace(int signalNumber, siginfo_t *signalInfo, void *signalContex *out << "Caught signal " << signalNumber << " raised at address " << ip << endl; // Do our own tracing because backtrace doesn't really work on all platforms. stacktrace_manually(*out, signalNumber, ip, bp); - #else + #elif __x86_64__ // Linux 64 bit does it this way ip = (void*)context->uc_mcontext.gregs[REG_RIP]; bp = (void**)context->uc_mcontext.gregs[REG_RBP]; diff --git a/src/preflight.cpp b/src/preflight.cpp index 94c5e6ab8a9..fde71e4b8e1 100644 --- a/src/preflight.cpp +++ b/src/preflight.cpp @@ -2,7 +2,10 @@ #include #include + +#ifdef __x86_64__ #include +#endif namespace vg { @@ -10,6 +13,7 @@ using namespace std; void preflight_check() { +#ifdef __x86_64__ // We assume we are on x86_64 on POSIX (and not Windows). // We use the method of dlib's dlib/simd/simd_check.h @@ -27,6 +31,8 @@ void preflight_check() { << "Please use a system with SSE4.2 support." << endl; exit(1); } +#endif + // If not on x86_64, we are probably on ARM and using fake SSE anyway. } diff --git a/src/preflight.hpp b/src/preflight.hpp index b8cb3dda1c5..7db872eab0d 100644 --- a/src/preflight.hpp +++ b/src/preflight.hpp @@ -11,10 +11,10 @@ namespace vg { -/// Define a macro to tell things to be built for every architecture, if possible. +/// Define a macro to tell things to be built for every X86_64 architecture, if possible. /// This *doesn't* work on Mac with GNU GCC and Apple libc++, because functions /// for x86-64 can't use std::endl, so we exclude that combination. -#if (!defined(__GNUC__) || !defined(_LIBCPP_VERSION) || !defined(__APPLE__)) +#if defined(__x86_64__) && (!defined(__GNUC__) || !defined(_LIBCPP_VERSION) || !defined(__APPLE__)) #define VG_PREFLIGHT_EVERYWHERE __attribute__((__target__("arch=x86-64"))) #else #define VG_PREFLIGHT_EVERYWHERE diff --git a/src/simde b/src/simde new file mode 160000 index 00000000000..8cd136a43ba --- /dev/null +++ b/src/simde @@ -0,0 +1 @@ +Subproject commit 8cd136a43bae7ab9b82316179b9cef8887726778 diff --git a/src/ssw_aligner.cpp b/src/ssw_aligner.cpp index 268eedd040a..64a75277bad 100644 --- a/src/ssw_aligner.cpp +++ b/src/ssw_aligner.cpp @@ -23,7 +23,13 @@ Alignment SSWAligner::align(const string& query, const string& ref) { gap_extension); StripedSmithWaterman::Filter filter; StripedSmithWaterman::Alignment alignment; - aligner.Align(query.c_str(), ref.c_str(), ref.size(), filter, &alignment); + + // We need to send out own mask length, recommended to be half the sequence length and at least 15. + int32_t mask_len = min(max((size_t) 15, query.size()), (size_t) numeric_limits::max()); + + assert(ref.size() <= numeric_limits::max()); + + aligner.Align(query.c_str(), ref.c_str(), (int) ref.size(), filter, &alignment, mask_len); return ssw_to_vg(alignment, query, ref); } diff --git a/test/wiki-data/mock-hs37d5/data/hs37d5.fa.fai b/test/wiki-data/mock-hs37d5/data/hs37d5.fa.fai new file mode 100644 index 00000000000..ec4fea30fa9 --- /dev/null +++ b/test/wiki-data/mock-hs37d5/data/hs37d5.fa.fai @@ -0,0 +1,86 @@ +1 1200 52 60 61 +2 1200 1324 60 61 +3 1200 2596 60 61 +4 1200 3868 60 61 +5 1200 5140 60 61 +6 1200 6412 60 61 +7 1200 7684 60 61 +8 1200 8956 60 61 +9 1200 10228 60 61 +10 1200 11502 60 61 +11 1200 12776 60 61 +12 1200 14050 60 61 +13 1200 15324 60 61 +14 1200 16598 60 61 +15 1200 17872 60 61 +16 1200 19145 60 61 +17 1200 20418 60 61 +18 1200 21691 60 61 +19 1200 22964 60 61 +20 1200 24237 60 61 +21 1200 25510 60 61 +22 1200 26783 60 61 +X 1200 28055 60 61 +Y 1200 29332 60 61 +MT 1400 30630 70 71 +GL000207.1 1200 32111 60 61 +GL000226.1 1200 33393 60 61 +GL000229.1 1200 34675 60 61 +GL000231.1 1200 35957 60 61 +GL000210.1 1200 37239 60 61 +GL000239.1 1200 38521 60 61 +GL000235.1 1200 39803 60 61 +GL000201.1 1200 41085 60 61 +GL000247.1 1200 42367 60 61 +GL000245.1 1200 43649 60 61 +GL000197.1 1200 44931 60 61 +GL000203.1 1200 46213 60 61 +GL000246.1 1200 47495 60 61 +GL000249.1 1200 48777 60 61 +GL000196.1 1200 50059 60 61 +GL000248.1 1200 51341 60 61 +GL000244.1 1200 52623 60 61 +GL000238.1 1200 53905 60 61 +GL000202.1 1200 55187 60 61 +GL000234.1 1200 56469 60 61 +GL000232.1 1200 57751 60 61 +GL000206.1 1200 59033 60 61 +GL000240.1 1200 60315 60 61 +GL000236.1 1200 61597 60 61 +GL000241.1 1200 62879 60 61 +GL000243.1 1200 64161 60 61 +GL000242.1 1200 65443 60 61 +GL000230.1 1200 66725 60 61 +GL000237.1 1200 68007 60 61 +GL000233.1 1200 69289 60 61 +GL000204.1 1200 70571 60 61 +GL000198.1 1200 71853 60 61 +GL000208.1 1200 73135 60 61 +GL000191.1 1200 74418 60 61 +GL000227.1 1200 75701 60 61 +GL000228.1 1200 76984 60 61 +GL000214.1 1200 78267 60 61 +GL000221.1 1200 79550 60 61 +GL000209.1 1200 80833 60 61 +GL000218.1 1200 82116 60 61 +GL000220.1 1200 83399 60 61 +GL000213.1 1200 84682 60 61 +GL000211.1 1200 85965 60 61 +GL000199.1 1200 87248 60 61 +GL000217.1 1200 88531 60 61 +GL000216.1 1200 89814 60 61 +GL000215.1 1200 91097 60 61 +GL000205.1 1200 92380 60 61 +GL000219.1 1200 93663 60 61 +GL000224.1 1200 94946 60 61 +GL000223.1 1200 96229 60 61 +GL000195.1 1200 97512 60 61 +GL000212.1 1200 98795 60 61 +GL000222.1 1200 100078 60 61 +GL000200.1 1200 101361 60 61 +GL000193.1 1200 102644 60 61 +GL000194.1 1200 103927 60 61 +GL000225.1 1200 105210 60 61 +GL000192.1 1200 106493 60 61 +NC_007605 1200 107724 60 61 +hs37d5 1200 108952 60 61 diff --git a/vgci/buildkit-deployment.yml b/vgci/buildkit-deployment.yml index c94e8c39e3c..1db768665bd 100644 --- a/vgci/buildkit-deployment.yml +++ b/vgci/buildkit-deployment.yml @@ -35,7 +35,26 @@ spec: - name: configure image: moby/buildkit:buildx-stable-1 imagePullPolicy: IfNotPresent - command: [/bin/sh, "-c", 'printf "[registry.\"docker.io\"]\nmirrors = [\"${DOCKER_HUB_MIRROR#*://}\"]\n[registry.\"${DOCKER_HUB_MIRROR#*://}\"]\nhttp = true\ninsecure = true\n" | tee /etc/buildkit/buildkitd.toml'] + # Set up to GC any container data over 80 GB. + # In the background? See https://github.com/moby/buildkit/issues/1962 + command: + - /bin/sh + - -c + - | + cat >/etc/buildkit/buildkitd.toml <