Docker Sandbox ile Bazel Uzaktan Yürütme Sorunlarını Giderme

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Yerel olarak başarılı olan Bazel derlemeleri, aşağıdaki nedenlerden dolayı uzaktan yürütüldüğünde başarısız olabilir: yerel derlemeleri etkilemeyen kısıtlamalar ve gereksinimler vardır. En yaygın bu tür hataların nedenleri Uzaktan Yürütme İçin Bazel Kurallarını Uyarlama bölümünde açıklanmıştır.

Bu sayfada, Google'ın karşılaştığı en yaygın sorunların nasıl tanımlanacağı ve bu kontrollerin devreye girdiği Docker korumalı alan özelliği aracılığıyla uzaktan yürütmeyle ilgili kısıtlamalara eşittir. Bu sayede uzaktan yürütme hizmetine ihtiyaç duymadan derlemenizle ilgili sorunları giderin.

Docker korumalı alan özelliği, uzaktan yürütme kısıtlamalarını şöyle olur:

  • Derleme işlemleri araç zinciri kapsayıcılarında yürütülür. Aynı derlemenizi bir hizmet aracılığıyla yerel olarak ve uzaktan çalıştırmak için araç zinciri container'ları container mimarisine alınmış uzaktan yürütmeyi destekler.

  • Hiçbir harici veri, container sınırını geçmez. Yalnızca açıkça bildirilen giriş ve çıkışlar, yalnızca container'a girip çıktıktan sonra ilişkili derleme işlemi başarıyla tamamlanır.

  • Her işlem yeni bir container'da yürütülür. Yeni ve benzersiz bir kapsayıcı, otomatik olarak oluşturulur.

Bu sorunları aşağıdaki yöntemlerden birini kullanarak giderebilirsiniz:

  • Yerel olarak sorun giderme. Bu yöntemle Bazel ve derleme işlemleri yerel makinenizde yerel olarak çalışır. Docker korumalı alan özelliği, derlemeye uzaktan kumandanınkine eşit kısıtlamalar uygular çok önemlidir. Ancak bu yöntem yerel araçları, eyaletleri ve verilerin derlemenize sızdırılmasına neden olur. Bu durum, uzaktan yürütmede sorunlara neden olur.

  • Docker container'ında sorun giderme. Bu yöntemle Bazel ve derleme işlemleri Docker container'ın içinde çalışır. Böylece, yerel kaynaklarınızdan araçları, durumları ve veri sızıntılarını ek olarak derlemeye uzaktan yürütmeye eşittir. Bu yöntem, çalışmaya devam etmesini sağlar. Bu yöntem deneyseldir resmi olarak desteklenmemektedir.

Ön koşullar

Sorun giderme işlemine başlamadan önce, henüz yapmadıysanız aşağıdakileri yapın:

  • Docker'ı yükleyin ve çalıştırmak için gereken izinleri yapılandırın.
  • Bazel 0.14.1 veya sonraki bir sürümü yükleyin. Önceki sürümler Docker'ı desteklemez korumalı alan özelliği.
  • bazel-toolchains'i ekleyin depo, derlemenizin WORKSPACE dosyasına en son sürüm sürümüne sabitlenmiş burada açıklandığı gibidir.
  • Özelliği etkinleştirmek için .bazelrc dosyanıza işaret ekleyin. Dosyayı şurada oluşturun: Bazel projenizin kök dizinini değil, dizini oluşturmanız gerekir. Aşağıdaki bayraklar referans örneklemdir. Lütfen son gelişmeleri inceleyin .bazelrc dosyasını seçin ve tanımlanan flag'lerin değerlerini kopyalayın docker-sandbox yapılandırması için burada.
# Docker Sandbox Mode
build:docker-sandbox --host_javabase=<...>
build:docker-sandbox --javabase=<...>
build:docker-sandbox --crosstool_top=<...>
build:docker-sandbox --experimental_docker_image=<...>
build:docker-sandbox --spawn_strategy=docker --strategy=Javac=docker --genrule_strategy=docker
build:docker-sandbox --define=EXECUTOR=remote
build:docker-sandbox --experimental_docker_verbose
build:docker-sandbox --experimental_enable_docker_sandbox

Kurallarınız ek araçlar gerektiriyorsa aşağıdakileri yapın:

  1. Dockerfile kullanarak araçlar yükleyerek özel bir Docker container'ı oluşturun. ve bina bir resim yükleyin.

  2. Yukarıdaki --experimental_docker_image işaretinin değerini özel container görüntünüzün adını girin.

Yerel olarak sorun giderme

Bu yöntem, Bazel'i ve tüm derleme işlemlerini doğrudan yerel Bu, derlemenizin yeni bir çözüm geliştirildiğinde derlemenizin uzaktan yürütülür.

Ancak bu yöntemle yerel olarak yüklenmiş araçlar, ikili programlar ve veriler sızdırabilir özellikle de yapılandırma stili WORKSPACE kuralları kullanıyorsa derlemenize ekleyin. Bu tür sızıntılar uzaktan yürütmede sorunlara neden olur; Docker kapsayıcısıyla ilgili sorunları giderin ve yerel olarak sorun giderme adımlarına göz atın.

1. Adım: Derlemeyi çalıştırın

  1. Yürütülen Bazel komutuna --config=docker-sandbox işaretini ekleyin kullanabilirsiniz. Örneğin:

    bazel --bazelrc=.bazelrc build --config=docker-sandbox target
    
  2. Derlemeyi çalıştırın ve tamamlanmasını bekleyin. Derleme en fazla dört tane olacak şekilde kat daha yavaş olduğunu gösterir.

Aşağıdaki hatayla karşılaşabilirsiniz:

ERROR: 'docker' is an invalid value for docker spawn strategy.

Bunu yaparsanız --experimental_docker_verbose işaretini kullanarak derlemeyi tekrar çalıştırın. Bu işaret, ayrıntılı hata mesajları sağlar. Bu hata genellikle ve mevcut kullanıcı hesabı. Docker belgelerine bakın konulu videomuzu izleyin. Sorun devam ederse Docker kapsayıcısında sorun giderme bölümüne geçin.

2. Adım: Algılanan sorunları çözün

Aşağıda, en sık karşılaşılan sorunlar ve bunların geçici çözümleri verilmiştir.

Docker container'ında sorun giderme

Bu yöntemle Bazel, ana makine Docker container'ının içinde çalışır ve Bazel'ın derlemesi Docker'ın oluşturduğu bağımsız araç zinciri container'larında işlemler yürütülür korumalı alan özelliği. Korumalı alan, her cihaz için yepyeni bir araç zinciri kapsayıcısı oluşturur. derleme işlemi olduğundan ve her araç zinciri container'ında yalnızca bir işlem yürütülür.

Bu yöntem, ana makinede yüklü araçlar üzerinde daha ayrıntılı kontrol sağlar. bahsedeceğim. Yapının yürütülmesinin yürütülmesinden ayrılarak gerekli olan birçok kontrole sahip olduğunu doğrulamak için, derlemenizin yerel yürütme ortamına bağımlı olup olmadığını kontrol edin.

1. Adım: Kapsayıcıyı oluşturun

  1. Docker container'ını oluşturan ve Bazel'i yükleyen bir Dockerfile oluşturun ile aşağıdaki işlemleri yapmanızı sağlar:

    FROM debian:stretch
    
    RUN apt-get update && apt-get install -y apt-transport-https curl software-properties-common git gcc gnupg2 g++ openjdk-8-jdk-headless python-dev zip wget vim
    
    RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
    
    RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
    
    RUN apt-get update && apt-get install -y docker-ce
    
    RUN wget https://releases.bazel.build/<latest Bazel version>/release/bazel-<latest Bazel version>-installer-linux-x86_64.sh -O ./bazel-installer.sh && chmod 755 ./bazel-installer.sh
    
    RUN ./bazel-installer.sh
    
  2. Kapsayıcıyı bazel_container olarak oluşturun:

    docker build -t bazel_container - < Dockerfile
    

2. Adım: Kapsayıcıyı başlatın

Aşağıda gösterilen komutu kullanarak Docker container'ını başlatın. Komutta, yerine, derlemek istediğiniz ana makinenizdeki kaynak kodunun yolunu kullanın.

docker run -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /tmp:/tmp \
  -v your source code directory:/src \
  -w /src \
  bazel_container \
  /bin/bash

Bu komut, container'ı kök olarak çalıştırır, Docker soketini eşler ve /tmp dizini. Bu, Bazel'in başka Docker container'ları oluşturmasına ve Bu kapsayıcılarla dosya paylaşmak için /tmp altındaki dizinleri kullanın. Kaynağınız kodu, kapsayıcının içindeki /src adresinde bulunabilir.

Bu komut, kasıtlı olarak şu özelliklere sahip bir debian:stretch temel container'dan başlar: olarak kullanılan rbe-ubuntu16-04 kapsayıcısıyla uyumlu olmayan ikili programları içerir araç zinciri kapsayıcısını açın. Yerel ortamdaki ikili programlar araç zinciri container'ı kaldırılırsa derleme hatalarına neden olur.

3. Adım: Kapsayıcıyı test edin

Test etmek için Docker container'ının içinden aşağıdaki komutları çalıştırın:

docker ps
bazel version

4. Adım: Derlemeyi çalıştırın

Derlemeyi aşağıda gösterildiği gibi çalıştırın. Çıkış kullanıcısı kök olarak ayarlanır ve bu nedenle ana makinenin içinden aynı mutlak yolla erişilebilen bir dizin Docker'ın oluşturduğu araç zinciri container'larından Bazel'in çalıştığı container korumalı alan özelliğini kullanabilir. Bu özellikte, Bazel'in derleme işlemlerinin çalıştığı yerel alan adından ve çalıştığı ana makine ve işlem container'larıdır.

bazel --output_user_root=/tmp/bazel_docker_root --bazelrc=.bazelrc \ build --config=docker-sandbox target

5. Adım: Algılanan sorunları çözün

Derleme hatalarını aşağıdaki şekilde çözebilirsiniz:

  • Derleme "disk alanı yetersiz" olarak başarısız oluyorsa bu sayıyı artırabilirsiniz. sınırı, ana makine kapsayıcısını --memory=XX işaretiyle başlatın; XX burada gigabayt cinsinden ayrılan disk alanıdır. Bu deneme amaçlıdır ve öngörülemeyen davranışlara yol açabilir.

  • Derleme, analiz veya yükleme aşamalarında başarısız olursa WORKSPACE dosyasında tanımlanan derleme kurallarınız ile uyumlu değil ele alacağız. Uzaktan Yürütme İçin Bazel Kurallarını Uyarlama bölümünü inceleyin. başlıklı bölüme bakın.

  • Derleme başka bir nedenle başarısız olursa 2. Adım: Algılanan sorunları giderin bölümündeki sorun giderme adımlarına bakın.