Gérez l'environnement d'exécution Python avec Docker et Pipenv et utilisez-le comme [VSCode] ](Https://code.visualstudio.com/) Développement à distance présente le mécanisme de commutation. L'actualité que Facebook s'est associée à Microsoft pour cette fonctionnalité est une fonctionnalité à chaud ces jours-ci. Les avantages de l'introduction de ceci sont:
--Docker: les bibliothèques dépendantes (LAPACK, etc.) et les paramètres de variables d'environnement qui ne peuvent pas être gérés par Pipenv peuvent également être gérés. --Pipenv: Les packages requis uniquement pour le développement (autopep8, etc.) peuvent être gérés séparément de l'environnement d'exécution, et la gestion des dépendances est plus facile que pip. --VSCode: peut être développé de manière transparente sur le conteneur docker construit avec les deux ci-dessus, et diverses extensions sont puissantes
Il y a de telles choses, alors je pense que le mérite de créer un environnement de développement en les combinant est formidable. L'image est composée comme suit.
Nous introduisons également des extensions et des paramètres recommandés pour développer Python avec VS Code!
Je pense qu'il existe différents articles qui expliquent en détail autre que celui officiel, veuillez donc vérifier chacun d'eux si ce qui précède est insuffisant.
Je pense que ceux qui exploitent des produits utilisant Docker ou Pipenv ont déjà fait 1 à 3, alors veuillez passer à 4. C'est un long chemin à parcourir, mais faisons de notre mieux pour créer un environnement confortable!
Décrivez le fichier de paramètres avec la structure suivante. J'expliquerai le rôle de chaque fichier et comment le créer dans l'ordre. Lisez {repo-name} comme nom du référentiel et {tool-name} comme répertoire racine de l'outil de développement.
{repo-name}
├── .devcontainer
│ ├── devcontainer.json
│ └── docker-compose.extend.yml
├── Dockerfile
├── Pipfile
├── docker-compose.yml
└── {tool-name}
J'ai honte de dire que je ne suis pas très familier avec Docker, donc je pense qu'il y a beaucoup de choses à faire, mais par exemple, créer un environnement sous la forme suivante.
Dockerfile
# Python 3.8 est mince-buster semble être recommandé
#référence: https://pythonspeed.com/articles/base-image-python-docker-images/
FROM python:3.8-slim-buster
#Définir les variables d'environnement
ENV HOME /root
ENV TZ Asia/Tokyo
WORKDIR $HOME
#Installer diverses bibliothèques utilisées en Python
# software-properties-common et wget sont requis pour une installation ultérieure de clang 8
RUN set -ex \
&& apt-get update \
&& apt-get install -y g++ git openssh-client wget libblas-dev liblapack-dev gnupg software-properties-common make
#installer clang 8
#Puisque numba dépend de llvmlite, installez la série clang 8 ensemble
RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - \
&& add-apt-repository "deb http://apt.llvm.org/buster/ llvm-toolchain-buster-8 main" \
&& apt-get update \
&& apt-get -y install clang-8 lldb-8 lld-8 gfortran
# llvm-Enregistrez le chemin d'accès à la configuration
ENV LLVM_CONFIG=/usr/lib/llvm-8/bin/llvm-config
#informations sur la clé hôte connues_Décrit dans les hôtes
#référence: https://gist.github.com/gregdeane/56a7499fddac7251f01dcc9bb64e8486
RUN mkdir -p -m 0600 ~/.ssh \
&& ssh-keyscan github.com >> ~/.ssh/known_hosts
#Installation de Pipenv
RUN pip3 --no-cache-dir install pipenv
#Créez un répertoire avec le nom du référentiel que vous souhaitez développer.
RUN mkdir {repo-name}
Cette fois, nous supposons que nous développerons un référentiel privé sur GitHub, donc nous ne clonerons pas le référentiel ni n'installerons les dépendances dans le Dockerfile. Le côté Docker-compose ne prend pas encore en charge --ssh default, donc installez-le par une autre méthode. Si vous développez dans un référentiel public, vous devez également faire git clone
ou pipenv install --dev
dans votre Dockerfile.
Tout en ajoutant les bibliothèques nécessaires à l'environnement d'exécution, listez les outils requis pour l'environnement de développement sous [dev-packages]
. Par exemple
Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
Cython = "*"
joblib = "*"
numpy = "*"
scipy = "*"
scikit-learn = "*"
lightgbm = "*"
[dev-packages]
nose = "*"
coverage ="*"
flake8 = "*"
isort = "*"
Sphinx = "*"
sphinx-autodoc-typehints = "*"
autopep8 = "*"
setuptools = "*"
mypy = "*"
[requires]
python_version = "3.8"
C'est comme ça. Tout d'abord, faisons en fait docker run
basé sur le Dockerfile ci-dessus et vérifions si ce Pipfile fonctionne correctement.
Installation basée sur Turorial of Remote Development. Il peut être facilement installé à partir de l'interface graphique VS Code ci-dessous.
C'est facile.
Créez un docker-compose.yml
qui construit le Dockerfile ci-dessus. Pour les fichiers Docker qui nécessitent que vous spécifiiez build-arg
, définissez-le ici. L'exemple le plus simple est
docker-compose.yml
version: "3.7"
services:
dev:
build:
context: .
dockerfile: Dockerfile
Est-ce une forme comme?
C'est la production d'ici. Créez un docker-compose.extend.yml
qui se compose uniquement des paramètres requis pour le développement à distance. En passant deux fichiers yaml dans .devcontainer.json
créés dans la section suivante, la construction se fera avec les paramètres auxquels chaque paramètre est appliqué dans l'ordre. Par exemple
yaml:docker-compose.extend.yml
version: "3.7"
services:
dev:
volumes:
- ~/.ssh/id_rsa:/root/.ssh/id_rsa:ro
command: sleep infinity
Faites comme ça.
Dans l'élément volumes
, la clé publique locale est montée sur l'image Docker utilisée dans le développement à distance. Par conséquent, vous devez enregistrer la clé publique de votre machine locale dans GitHub. Voir ici pour plus de détails sur la façon de procéder. Encore une fois, c'est un élément inutile car aucune authentification n'est requise lors du développement avec un référentiel public.
De plus, «commande» est requise cette fois. Sans cela, le développement à distance ne ferait que construire et mourir ...
C'est un autre souffle quand tu viens ici. C'est un fichier qui spécifie comment créer le Dockerfile créé ci-dessus. Voici un exemple et le rôle de chaque paramètre dans les commentaires.
json:.devcontainer.json
{
#Devenez le nom de Workspace.
"name": "{repo-name} DevEnv",
#Répertoire racine utilisé pour spécifier l'emplacement du fichier de configuration.
"context": ".",
# docker-Liste des chemins vers yml utilisés dans la composition.Ordre strict.
"dockerComposeFile": [
"../docker-compose.yml",
"docker-compose.extend.yml"
],
#Un docker avec des paramètres de construction pour l'environnement de développement-compse.nom du service sur yml.
"service": "dev",
"shutdownAction": "stopCompose",
#Répertoire racine pour être un projet VS Code.
"workspaceFolder": "/root/{repo-name}",
#Commande à exécuter lorsque la construction de Docker est terminée.Clonez et installez le référentiel ici.
"postCreateCommand": "git clone -b {branch name} {GitHub url} . && pipenv install --dev",
#Paramètres à appliquer au nouveau VS Code lancé par Remote Development.
"settings": {
"autoDocstring.docstringFormat": "sphinx",
"autoDocstring.guessTypes": false,
"editor.formatOnSave": true,
"editor.suggestSelection": "first",
"git.autofetch": true,
"git.confirmSync": false,
"kite.showWelcomeNotificationOnStartup": false,
"python.formatting.autopep8Args": [
"--max-line-length=200"
],
"python.linting.pylintEnabled": false,
"python.linting.flake8Args": [
"--max-line-length=200"
],
"python.linting.flake8Enabled": true,
"python.linting.mypyEnabled": true,
"python.jediEnabled": false,
"terminal.integrated.inheritEnv": false,
"vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue"
},
#Si vous enregistrez l'ID de l'extension que vous souhaitez utiliser dans l'environnement distant, il sera installé automatiquement lors de la création de l'environnement..
"extensions": [
"ms-python.python",
"njpwerner.autodocstring",
"ms-azuretools.vscode-docker",
"visualstudioexptteam.vscodeintellicode"
]
}
Pour compléter l'extension,
njpwerner.autodocstring
Un outil qui génère automatiquement des docstrings pour les fonctions et les classes en Python. Je veux générer automatiquement du HTML pour les documents avec Sphinx, donc " autoDocstring .docstringFormat ":" sphinx "
définit également le style de la docstring.
visualstudioexptteam.vscodeintellicode Un outil super utile qui fait une complétion très puissante pour Python. "" Python.jediEnabled ": false` est un paramètre obligatoire.
python.linting
Je pense que c'est un péché de ne pas mentionner l'indication de type dans la série Python3, donc "" python.linting.mypyEnabled ": true est requis, et il est difficile de lire que max-line-length est la valeur par défaut sur le moniteur actuel. Puisqu'il n'y a aucune aide pour cela, "" --max-line-length = 200 "" est spécifié pour chacun de ʻautopep8
et flake8
. Le linter par défaut pour Python dans VSCode est pylint, mais quand je l'ai utilisé, j'avais beaucoup de dépendance autour de l'importation, donc [flake8](http :: //flake8.pycqa.org/en/latest/) est utilisé.
C'est comme ça.
(Pour Ubuntu) Ouvrez la fenêtre de commande avec Ctrl + Shift + p sur VSCode et appuyez sur ʻOpen Folder in Container ... `comme indiqué ci-dessous.
Si vous spécifiez le répertoire dans lequel se trouve le Dockerfile local, la compilation démarre automatiquement et VSCode qui s'exécute sur l'environnement construit sur le Docker Container sera nouvellement lancé. La première fois, la construction de docker et de pipenv prend du temps, alors attendez patiemment.
Enfin, l'interpréteur de Python peut ne pas reconnaître l'environnement pipenv, mais exécuter reload window
à partir de la fenêtre de commande le corrigera.
Ceci complète l'environnement de développement! Je vous remercie pour votre travail acharné! !!