Une histoire d'essayer un monorepo (Golang +) Python avec Bazel

Cet article est le troisième jour du Calendrier de l'Avent OpenSaaS Studio 2019.

introduction

Le premier est une configuration mono-repo utilisant Bazel dans les microservices Golang et Python. Je me suis demandé si Python pouvait être mélangé dans le référentiel mono si j'utilisais Bazel, qui prend en charge plusieurs langues, mais c'était difficile, donc je vais laisser un point difficile.

supposition

motivation

Point bouché

Python 2 et 3 sont requis

J'ai utilisé uniquement la série Python3 dans le service, mais j'avais besoin de la série Python2 pour pousser l'image créée. J'ai utilisé Container Registry comme registre d'images pour le conteneur. Bazel a donc besoin du SDK Google Cloud pour pousser l'image et y est lié. Je pense que le système Python2 était nécessaire sous la forme d'une suite. Description du SDK Google Cloud

Les versions récentes de macOS incluent la version appropriée de Python requise pour le SDK Google Cloud. Le SDK Cloud nécessite Python 2 avec un numéro de version Python 2.7.9 ou version ultérieure. Si vous installez un interpréteur Python supplémentaire, il ne doit pas interférer avec l'installation du SDK Google Cloud.

Qu'est-il arrivé

Bazel a un mécanisme qui vous permet de spécifier l'interpréteur Python à utiliser lors de la construction, donc je l'ai utilisé.

La définition de l'interpréteur et la définition de construction ressemblent à ceci.

load("@rules_python//python:defs.bzl", "py_runtime_pair")

py_runtime(
    name = "py2_local_bin_runtime",
    interpreter_path = "/usr/local/bin/python2",
    python_version = "PY2",
)

py_runtime(
    name = "py3_6_local_bin_runtime",
    interpreter_path = "/usr/local/bin/python3.6",
    python_version = "PY3",
)

py_runtime_pair(
    name = "py_local_bin_runtime_pair",
    py2_runtime = ":py2_local_bin_runtime",
    py3_runtime = ":py3_6_local_bin_runtime",
)

toolchain(
    name = "py_mac_toolchain",
    exec_compatible_with = [
        "@bazel_tools//platforms:osx",
        "@bazel_tools//platforms:x86_64",
    ],
    toolchain = "py_local_bin_runtime_pair",
    toolchain_type = "@rules_python//python:toolchain_type",
)
register_toolchains(
    "//:py_mac_toolchain",
    "//:py_linux_toolchain",
)
py_binary(
    name = "mysite",
    srcs = ["manage.py"],
    deps = [
        "//mysite/mysite:py_default_library",
        "//mysite/polls:py_default_library",
    ],
    main = "manage.py",
    python_version = "PY3",
)

Je ne parviens pas à obtenir une bibliothèque prenant en charge Python3

Lors de l'utilisation de Bazel Rules for Python, il semble que le pip associé à la commande python soit exécuté lors du téléchargement de la bibliothèque. Comme je l'ai écrit ci-dessus, le python par défaut était la série 2, donc je pouvais télécharger la bibliothèque de la série Python 3. Le code est par ici

Qu'est-il arrivé

Changé en python-> python3.6 afin que 3 séries puissent être utilisées en forçant .. Cependant, lorsque j'ai vérifié la dernière version, elle était compatible Pip3 par défaut, donc il n'y a peut-être plus de problème maintenant.

Souffrant du point d'entrée de l'image créée

Bazel a une règle par défaut (py3_image) pour créer une image Docker Python3, et lorsque je l'ai construite en combinaison avec python: 3.6-slim, l'image créée n'a pas pu être démarrée. La définition de construction ressemble à ceci

container_pull(
    name = "py3_base",
    registry = "index.docker.io",
    repository = "library/python",
    tag = "3.6-slim",
)
py3_image(
    name = "mysite_image",
    srcs = ["manage.py"],
    deps = [
        "//mysite/mysite:py_default_library",
        "//mysite/polls:py_default_library",
    ],
    main = "manage.py",
    base = "@py3_base//image",
)

En fait, le point d'entrée de l'image créée par py3_image est / usr / bin / python par défaut, mais en python: 3.6-slim, la commande python n'est pas définie dans ce chemin et ne peut pas être démarrée. fait. Le code est par ici

Qu'est-il arrivé

J'ai utilisé cette image car elle commençait normalement avec python: 3.6. (L'optimisation de l'image est supposée être effectuée plus tard si nécessaire)

La version Python est différente pour chaque service

Il y avait trois services Python, et les versions de Python que j'utilisais étaient toutes différentes de 3.5, 3.6 et 3.7. La méthode d'utilisation de l'interpréteur Python décrite ci-dessus ne peut séparer que les 2e et 3e systèmes, donc ce mécanisme ne peut pas le gérer.

Qu'est-il arrivé

J'ai décidé de déplacer toutes les versions de Python utilisées dans le service vers la version 3.6. La vérification a pris beaucoup de temps jusqu'à présent, et j'ai pensé que compliquer la configuration autour de la construction s'écarterait de la politique d'origine, j'ai donc décidé de réduire le nombre de choses à gérer. Si vous souhaitez coexister avec plusieurs versions de Python3, vous pourrez peut-être séparer WORKSPACE et spécifier l'interpréteur Python requis pour chacune. (non confirmé)

├── service_for_python3.6
│   └── WORKSPACE <-Python3 ici.Mettre en place 6 interprètes
├── service_for_python3.7
│   └── WORKSPACE <-Python3 ici.Set 7 interprètes
└── WORKSPACE

L'importation de «__init __. Py» est interrompue

(Probablement) Le même événement que ce problème s'est produit dans la bibliothèque de la série google-cloud-XXX. Il semble que le problème ait été causé par la structure de répertoires différente lors de l'installation de la bibliothèque avec pip install et lors de la construction avec Bazel.

Qu'est-il arrivé

Il y a aussi un Comment dans le problème, mais il peut maintenant être exécuté en spécifiant l'attribut legacy_create_init.

L'image Docker et la plate-forme d'environnement de construction sont différentes

J'utilise tensorflow-gpu pour certains services et je n'ai pas pu télécharger la bibliothèque car l'environnement de construction n'avait pas de GPU.

Qu'est-il arrivé

Ce n'est pas résolu. Cela fait un moment que j'ai commencé la vérification, alors je l'ai arrondie ici. Bazel peut être en mesure de le gérer en spécifiant une plate-forme associée au GPU (si elle existe) ou en construisant ce service sur une ferme de construction qui a le GPU.

Résumé

Recommended Posts

Une histoire d'essayer un monorepo (Golang +) Python avec Bazel
L'histoire de la création d'une partition de type Hanon avec Python
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ②
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ①
Une histoire sur la tentative d'implémentation de variables privées en Python.
Une histoire à propos d'un débutant en python coincé avec aucun module nommé'ttp.server '
Une histoire sur l'ajout d'une API REST à un démon créé avec Python
Une histoire sur l'apprentissage automatique avec Kyasuket
Une histoire sur le développement d'un type logiciel avec Firestore + Python + OpenAPI + Typescript
[Note] Une histoire sur la tentative de remplacer une méthode de classe avec deux barres inférieures dans la série Python 3.
Une histoire sur la tentative d'exécuter plusieurs versions de Python (édition Mac)
Une histoire sur Python pop and append
[Python3] Une histoire bloquée avec la conversion du fuseau horaire
Une histoire sur la gestion des données binaires en Python
Une histoire sur l'implémentation d'un écran de connexion avec django
Une histoire sur l'exécution de Python sur PHP sur Heroku
Une histoire sur la modification de Python et l'ajout de fonctions
Histoire de l'utilisation du jeton logiciel de Resona avec 1Password
Une histoire de prédiction du taux de change avec Deep Learning
L'histoire de la gestion de theano avec TSUBAME 2.0
Un mémo sur la création d'une application Django (Python) avec Docker
Une histoire sur la façon dont les utilisateurs de Windows 10 ont créé un environnement pour utiliser OpenCV3 avec Python 3.5
Une histoire sur un débutant Python essayant d'obtenir des résultats de recherche Google à l'aide de l'API
Une histoire sur la tentative d'introduire Linter au milieu d'un projet Python (Flask)
Histoire de trébucher avec le tableau Python
Mémorandum sur la corrélation [Python]
Faites une loterie avec Python
Un mémorandum sur le simulacre de Python
Créer un répertoire avec python
Une note sur [python] __debug__
Une note sur l'utilisation de l'API Facebook avec le SDK Python
Une histoire sur la façon de spécifier un chemin relatif en python.
Une histoire de compétition avec un ami dans Othello AI Preparation
[python] Remarques lors de la tentative d'utilisation de numpy avec Cython
Une histoire sur l'installation de matplotlib à l'aide de pip avec une erreur
Une histoire sur la façon de traiter le problème CORS
Une histoire sur la création d'une courte chanson par hasard avec Sudachi Py
Apprentissage automatique Une histoire sur des personnes qui ne sont pas familiarisées avec GBDT utilisant GBDT en Python
[Django] Une histoire sur le fait de rester coincé dans un marais en essayant de valider un zip avec un formulaire [TDD]
[Python, Selenium, PhantomJS] Une histoire lors de la capture d'un site Web avec une charge paresseuse
[Python] Qu'est-ce qu'une instruction with?
Résoudre ABC163 A ~ C avec Python
Manuel de graphisme Python avec Matplotlib.
Une histoire rafraîchissante sur Slice en Python
Une histoire d'essayer d'automatiser un chot lorsque vous cuisinez vous-même
Faisons une interface graphique avec python.
Python: une note sur les classes 1 "Résumé"
Une histoire de mauvaise humeur sur Slice en Python
Créez un environnement virtuel avec Python!
J'ai fait une loterie avec Python.
L'histoire de la création d'un pilote standard pour db avec python.
Créer un environnement virtuel avec Python 3
Résoudre ABC168 A ~ C avec Python
Créer un système de recommandation avec python
[Petite histoire] Obtenez l'horodatage avec Python
Générer une URL pré-signée avec golang
[Python] Générer un mot de passe avec Slackbot
Résoudre ABC162 A ~ C avec Python
Résoudre ABC167 A ~ C avec Python
Résoudre ABC158 A ~ C avec Python