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

Sorun bildir Kaynağı görüntüle Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Yerel olarak başarılı olan Bazel derlemeleri, yerel derlemeleri etkilemeyen kısıtlamalar ve gereksinimler nedeniyle uzaktan yürütüldüğünde başarısız olabilir. Bu tür hataların en yaygın nedenleri Adapting Bazel Rules for Remote Execution (Uzaktan Yürütme İçin Bazel Kurallarını Uyarlama) başlıklı makalede açıklanmıştır.

Bu sayfada, Docker sanal alanı özelliği kullanılarak uzaktan yürütmeyle ilgili en yaygın sorunların nasıl belirleneceği ve çözüleceği açıklanmaktadır. Bu özellik, derleme üzerinde uzaktan yürütmeyle aynı kısıtlamaları uygular. Bu sayede, uzaktan yürütme hizmetine gerek kalmadan derlemenizle ilgili sorunları giderebilirsiniz.

Docker korumalı alan özelliği, uzaktan yürütmenin kısıtlamalarını aşağıdaki gibi taklit eder:

  • Derleme işlemleri, araç zinciri container'larında yürütülür. Derlemenizi yerel olarak ve kapsayıcılı uzaktan yürütmeyi destekleyen bir hizmet aracılığıyla uzaktan çalıştırmak için aynı araç zinciri kapsayıcılarını kullanabilirsiniz.

  • Kapsayıcı sınırını aşan gereksiz veri yok. Kapsayıcıya yalnızca açıkça beyan edilen girişler ve çıkışlar girip çıkar ve bu işlem yalnızca ilişkili derleme işlemi başarıyla tamamlandıktan sonra gerçekleşir.

  • Her işlem yeni bir kapsayıcıda yürütülür. Her oluşturulan derleme işlemi için yeni ve benzersiz bir kapsayıcı 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 doğal olarak çalışır. Docker sandbox özelliği, derleme üzerinde uzak yürütme ile aynı kısıtlamaları uygular. Ancak bu yöntem, derlemenize sızan yerel araçları, durumları ve verileri algılamaz. Bu durum, uzaktan yürütmeyle ilgili sorunlara neden olur.

  • Docker container'da sorun giderme Bu yöntemle Bazel ve derleme işlemleri bir Docker container'da çalışır. Bu sayede, yerel makineden derlemeye sızan araçları, durumları ve verileri tespit edebilir, ayrıca uzak yürütme ile aynı kısıtlamaları uygulayabilirsiniz. Bu yöntem, derlemenin bazı kısımları başarısız olsa bile derlemeniz hakkında bilgi sağlar. Bu yöntem deneyseldir ve resmi olarak desteklenmez.

Ön koşullar

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

  • Docker'ı yükleyin ve çalıştırmak için gereken izinleri yapılandırın.
  • Bazel 0.14.1 veya sonraki sürümlerini yükleyin. Önceki sürümler, Docker sanal alanı özelliğini desteklemez.
  • En son yayın sürümüne sabitlenmiş bazel-toolchains reposunu, WORKSPACE dosyanıza burada açıklandığı şekilde ekleyin.
  • Özelliği etkinleştirmek için .bazelrc dosyanıza işaretler ekleyin. Dosya yoksa Bazel projenizin kök dizininde oluşturun. Aşağıdaki işaretler örnek referans olarak verilmiştir. Lütfen bazel-toolchains deposundaki en son .bazelrc dosyasını inceleyin ve orada tanımlanan işaretlerin değerlerini docker-sandbox yapılandırması için kopyalayın.
# 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ükleyip görüntüyü yerel olarak oluşturarak özel bir Docker container'ı oluşturun.

  2. Yukarıdaki --experimental_docker_image işaretinin değerini özel kapsayıcı resminizin adıyla değiştirin.

Yerel olarak sorun giderme

Bu yöntem, Bazel'ı ve tüm derleme işlemlerini doğrudan yerel makinede yürütür. Bu yöntem, derlemenizin uzaktan yürütüldüğünde başarılı olup olmayacağını onaylamanın güvenilir bir yoludur.

Ancak bu yöntemde, özellikle configure tarzı WORKSPACE kuralları kullanılıyorsa yerel olarak yüklenen araçlar, ikili dosyalar ve veriler derlemenize sızabilir. Bu tür sızıntılar, uzaktan yürütmeyle ilgili sorunlara neden olur. Bunları tespit etmek için yerel olarak sorun gidermenin yanı sıra Docker kapsayıcısında sorun giderin.

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

  1. Derlemenizi yürüten Bazel komutuna --config=docker-sandbox işaretini ekleyin. Örneğin:

    bazel --bazelrc=.bazelrc build --config=docker-sandbox target
  2. Derlemeyi çalıştırın ve tamamlanmasını bekleyin. Docker sandbox özelliği nedeniyle derleme, normalden dört kat daha yavaş çalışır.

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

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

Bu durumda, derlemeyi --experimental_docker_verbose işaretiyle tekrar çalıştırın. Bu işaret, ayrıntılı hata mesajlarını etkinleştirir. Bu hata genellikle hatalı bir Docker yüklemesinden veya mevcut kullanıcı hesabı altında Docker'ı çalıştırmak için gerekli izinlerin olmamasından kaynaklanır. Daha fazla bilgi için Docker belgelerini inceleyin. Sorun devam ederse Docker kapsayıcısında sorun giderme bölümüne geçin.

2. adım: Tespit edilen sorunları çözün

En sık karşılaşılan sorunlar ve geçici çözümleri aşağıda verilmiştir.

  • Bazel runfiles ağacı tarafından referans verilen bir dosya, araç, ikili program veya kaynak eksik. Etkilenen hedeflerin tüm bağımlılıklarının açıkça beyan edildiğini onaylayın. Daha fazla bilgi için Örtülü bağımlılıkları yönetme başlıklı makaleyi inceleyin.

  • Mutlak bir yolla veya PATH değişkeniyle referans verilen bir dosya, araç, ikili dosya ya da kaynak eksik. Gerekli tüm araçların araç zinciri kapsayıcısına yüklendiğini onaylayın ve eksik kaynağı işaret eden bağımlılıkları düzgün şekilde bildirmek için araç zinciri kurallarını kullanın. Daha fazla bilgi için Invoking build tools through toolchain rules (Araç zinciri kuralları aracılığıyla derleme araçlarını çağırma) başlıklı makaleye bakın.

  • İkili yürütme başarısız olur. Derleme kurallarından biri, yürütme ortamıyla (Docker kapsayıcısı) uyumlu olmayan bir ikili dosyaya referans veriyor. Daha fazla bilgi için Platforma bağlı ikili dosyaları yönetme başlıklı makaleyi inceleyin. Sorunu çözemiyorsanız yardım için bazel-discuss@google.com adresiyle iletişime geçin.

  • @local-jdk kaynağından bir dosya eksik veya hatalara neden oluyor. Yerel makinenizdeki Java ikilileri, derlemeyle uyumlu olmamasına rağmen derlemeye sızıyor. Kurallarınızda ve hedeflerinizde @local_jdk yerine java_toolchain kullanın. Daha fazla yardıma ihtiyacınız varsa bazel-discuss@google.com adresiyle iletişime geçin.

  • Diğer hatalar. Yardım için bazel-discuss@google.com adresiyle iletişime geçin.

Docker container'da sorun giderme

Bu yöntemde Bazel, bir ana makine Docker container'ının içinde çalışır ve Bazel'in derleme işlemleri, Docker sandbox özelliği tarafından oluşturulan ayrı ayrı araç zinciri container'larında yürütülür. Sandbox, her derleme işlemi için yepyeni bir araç zinciri kapsayıcısı oluşturur ve her araç zinciri kapsayıcısında yalnızca bir işlem yürütülür.

Bu yöntem, ana makine ortamına yüklenen araçlar üzerinde daha ayrıntılı kontrol sağlar. Derlemenin yürütülmesini derleme işlemlerinin yürütülmesinden ayırarak ve yüklü araçları minimum düzeyde tutarak derlemenizin yerel yürütme ortamına bağımlı olup olmadığını doğrulayabilirsiniz.

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

  1. Docker container'ı oluşturan ve Bazel'i minimum derleme araçlarıyla yükleyen bir Dockerfile oluşturun:

    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 kapsayıcısını başlatın. Komutta, ana makinenizde oluşturmak istediğiniz kaynak kodunun yolunu girin.

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, kapsayıcıyı kök olarak çalıştırır, Docker soketini eşler ve /tmp dizinini bağlar. Bu sayede Bazel, diğer Docker kapsayıcılarını oluşturabilir ve bu kapsayıcılarla dosya paylaşmak için /tmp altındaki dizinleri kullanabilir. Kaynak kodunuz, kapsayıcının içindeki /src konumunda bulunur.

Komut, kasıtlı olarak bir araç zinciri kapsayıcısı olarak kullanılan rbe-ubuntu16-04 kapsayıcısıyla uyumsuz ikili dosyalar içeren bir debian:stretch temel kapsayıcıdan başlatılır. Yerel ortamdaki ikili dosyalar araç zinciri kapsayıcısına sızarsa derleme hatalarına neden olurlar.

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

Test etmek için Docker container'ı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ı, Bazel'in çalıştığı ana makine container'ının içinden, Bazel'in derleme işlemlerinin çalıştığı Docker sandbox özelliğinin oluşturduğu araç zinciri container'larından ve ana makine ile işlem container'larının çalıştığı yerel makineden aynı mutlak yolla erişilebilen bir dizine karşılık gelmesi için kök kullanıcıdır.

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

5. adım: Tespit edilen sorunları çözün

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

  • Derleme işlemi "disk alanı yetersiz" hatasıyla başarısız olursa ana makine kapsayıcısını --memory=XX işaretiyle başlatarak bu limiti artırabilirsiniz. Burada XX, gigabayt cinsinden ayrılan disk alanıdır. Bu özellik deneyseldir ve öngörülemeyen davranışlara neden olabilir.

  • Derleme, analiz veya yükleme aşamalarında başarısız olursa WORKSPACE dosyasında belirtilen derleme kurallarınızdan en az biri uzak yürütmeyle uyumlu değildir. Olası nedenler ve geçici çözümler için Adapting Bazel Rules for Remote Execution (Uzaktan Yürütme İçin Bazel Kurallarını Uyarlama) başlıklı makaleye bakın.

  • Derleme başka bir nedenle başarısız olursa 2. adım: Tespit edilen sorunları çözme bölümündeki sorun giderme adımlarına bakın.