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

Sorun bildir Kaynağı görüntüleyin Nightly · 7.4 .

Yerel olarak başarılı olan Bazel derlemeleri, yerel derlemeleri etkilemeyen kısıtlamalar ve koşullar nedeniyle uzaktan çalıştırıldığında başarısız olabilir. Bu tür hatalara en sık neden olan durumlar Uzaktan Çalıştırma için Bazel Kurallarını Uyarlama başlıklı makalede açıklanmıştır.

Bu sayfada, Docker korumalı alanı özelliği kullanılarak uzaktan yürütmeyle ilgili ortaya çıkan en yaygın sorunların nasıl tanımlanacağı ve çözüleceği açıklanmaktadır. Bu özellik, derleme işlemine uzaktan yürütmeyle aynı kısıtlamaları uygular. Bu sayede, uzaktan yürütme hizmetine ihtiyaç duymadan derlemenizde sorun 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 kapsayıcılarında yürütülür. Derlemenizi, kapsayıcıya alınmış uzaktan yürütmeyi destekleyen bir hizmet aracılığıyla yerelde ve uzaktan çalıştırmak için aynı araç zinciri kapsayıcılarını kullanabilirsiniz.

  • Kapsayıcı sınırını aşmayan ek veriler Yalnızca açıkça tanımlanmış girişler ve çıkışlar kapsayıcıya girip kapsayıcıdan çı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. Oluşturulan her derleme işlemi için yeni ve benzersiz bir kapsayıcı oluşturulur.

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

  • Sorunları doğal olarak giderme. Bu yöntemle, Bazel ve derleme işlemleri yerel makinenizde yerel olarak çalışır. Docker korumalı alan özelliği, derleme işlemine uzaktan yürütme işlemiyle aynı kısıtlamaları uygular. Ancak bu yöntem, derlemenize sızan yerel araçları, durumları ve verileri algılamaz. Bu da uzaktan yürütmeyle ilgili sorunlara neden olur.

  • Docker kapsayıcısında sorun giderme. Bu yöntemde Bazel ve derleme işlemleri bir Docker kapsayıcısında çalıştırılır. Bu sayede, yerel makineden derlemeye sızan araçları, durumları ve verileri tespit edebilir, uzaktan yürütmeyle aynı kısıtlamaları uygulayabilirsiniz. Bu yöntem, derlemenin bazı bölümleri başarısız olsa bile derlemeniz hakkında bilgi sağlar. Bu yöntem deneyseldir ve 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 korumalı alan özelliğini desteklemez.
  • bazel-toolchains repo'sunu, en son sürüm sürümüne sabitlenmiş olarak burada açıklandığı şekilde derlemenizin WORKSPACE dosyasına ekleyin.
  • Özelliği etkinleştirmek için .bazelrc dosyanıza işaretler ekleyin. Dosyayı, Bazel projenizin kök dizininde oluşturun (mevcut değilse). Aşağıdaki işaretler referans bir örnektir. Lütfen bazel-toolchains deposundaki en yeni .bazelrc dosyasını inceleyin ve docker-sandbox yapılandırması için burada tanımlanan işaretlerin değerlerini 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 derleyerek özel bir Docker kapsayıcısı 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'i ve tüm derleme işlemlerini doğrudan yerel makinede yürütür. Derlemenizin uzaktan çalıştırıldığında başarılı olup olmayacağını doğrulamak için güvenilir bir yöntemdir.

Ancak bu yöntemle, yerel olarak yüklenen araçlar, ikili dosyalar ve veriler, özellikle yapılandırma stilinde WORKSPACE kuralları kullanılıyorsa derlemenize sızabilir. Bu tür sızıntılar, uzaktan yürütmeyle ilgili sorunlara neden olur. Bu sorunları 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. Derleme, Docker korumalı alanı özelliği nedeniyle 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 çalıştırma izinlerinin eksik olmasından kaynaklanır. Daha fazla bilgi için Docker belgelerine bakın. Sorunlar 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 kapsayıcısında sorun giderme

Bu yöntemle Bazel, ana makine Docker container'ının içinde çalışır. Bazel'in derleme işlemleri ise Docker korumalı alanı özelliği tarafından oluşturulan bağımsız araç zinciri container'larında yürütülür. Korumalı alan, her derleme işlemi için yepyeni bir araç zinciri kapsayıcısı oluşturur ve her araç zinciri container'ı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ı en aza indirerek derlemenizin yerel yürütme ortamıyla herhangi bir bağımlılık içerip içermediğini doğrulayabilirsiniz.

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

  1. Docker kapsayıcısını oluşturan ve Bazel'i minimum sayıda derleme aracı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 container'ını başlatın. Komutta, barındırma sunucunuzda derlemek istediğiniz kaynak kodun 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ı root 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ı içindeki /src adresinde bulunur.

Komut, araç zinciri kapsayıcısı olarak kullanılan rbe-ubuntu16-04 kapsayıcısıyla uyumlu olmayan ikili dosyaları içeren debian:stretch temel bir kapsayıcıdan kasıtlı olarak başlar. Yerel ortamdaki ikili dosyalar araç seti kapsayıcısına sızıyorsa 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ı root olduğundan Bazel'in çalıştığı ana makine kapsayıcısının içinden, Bazel'in derleme işlemlerinin çalıştığı Docker korumalı alanı özelliği tarafından oluşturulan araç zinciri kapsayıcılarından ve ana makine ile işlem kapsayıcılarının çalıştığı yerel makineden aynı mutlak yola erişilebilen bir dizine karşılık gelir.

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ı bitti" hatasıyla başarısız olursa ana makine container'ını --memory=XX işaretiyle başlatarak bu sınırı artırabilirsiniz. Burada XX, gigabayt cinsinden ayrılan disk alanıdır. Bu özellik deneyseldir ve beklenmedik davranışlara neden olabilir.

  • Derleme analiz veya yükleme aşamaları sırasında başarısız olursa WORKSPACE dosyasında tanımlanan derleme kurallarınızdan bir veya daha fazlası uzaktan yürütmeyle uyumlu değildir. Olası nedenler ve geçici çözümler için Bazel Kurallarını Uzaktan Çalıştırmaya Uyarlama başlıklı makaleyi inceleyin.

  • 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.