[LINUX] Différence entre le fichier env_file docker-compose et le fichier .env

Dans docker-compose, j'étais confus jusqu'à maintenant

--Fichier à lire par ʻenv_file dans docker-compose.yml --Fichier nommé.env`

Notez la différence pour que personne d'autre ne fasse la même erreur.

Étant donné que la gestion des variables d'environnement est légèrement différente entre Linux et Windows, je pense que les personnes qui sont habituées à Windows ou qui utilisent le docker pour Windows sont susceptibles de se faire prendre.

C'est fondamentalement la même chose que cette question et réponse, mais avec un peu plus d'informations.

docker-compose cannot understand my env_file | stack overflow

variables docker-compose et d'environnement

Référence officielle Documentation Docker | Variables d'environnement dans compose Je vais vous expliquer tout en organisant les connaissances avec.

Variables d'environnement hôte utilisées dans docker-compose.yml

Dans docker-compose.yml, vous pouvez utiliser les variables d'environnement du shell côté hôte.

Par exemple

docker-compose.yml


web:
  image: "webapp:${TAG}"

Si la variable d'environnement «TAG» est définie du côté hôte, cette valeur sera insérée. Par exemple, si TAG est défini sur v1.5, le nom de l'image créée par docker-compose build sera webapp: v1.5.

Vous pouvez vérifier quelle valeur est insérée dans la variable d'environnement set avec la commande docker-compose config.

$ echo $TAG
#Echo pour Windows%TAG%Confirmer avec
v1.5

$ docker-compose config

version: '3'
services:
  web:
    image: 'webapp:v1.5'

Fichier .env

Cependant, les variables d'environnement que vous souhaitez utiliser pour l'hôte ne sont pas toujours définies. Pour contourner ce problème, vous pouvez définir la valeur par défaut de la variable d'environnement utilisée dans docker-compose.yml dans le fichier .env. Par exemple dans le fichier .env

.env


TAG=v1.5

S'il est défini sur, le nom de l'image sera webapp: v1.5 comme ci-dessus.

Le fichier .env doit se trouver dans le répertoire où vous avez exécuté la commande ** docker-compose (répertoire de travail) ** Il ne sera pas reconnu ailleurs. (Voir Déclarer les variables d'environnement par défaut dans le fichier)

Ce paramètre de fichier .env est une solution de contournement si l'hôte ne possède pas les variables d'environnement que vous souhaitez utiliser. Bien sûr, si une variable d'environnement avec le même nom est définie sur l'hôte, cela aura la priorité.

$ export TAG=v2.0
#Pour Windows, définissez TAG=v2.Définir la variable d'environnement sur 0
$ docker-compose config

version: '3'
services:
  web:
    image: 'webapp:v2.0'

Variables d'environnement dans le conteneur lancé

** En dehors de l'histoire ci-dessus ** En utilisant l'élément ʻenvironment dans docker-compose.yml, la variable d'environnement pour le conteneur lancé par docker-compose run ou docker-compose up` Vous pouvez définir le.

docker-compose.yml


web:
  environment:
    - DEBUG=1

Ensuite, dans le conteneur qui a démarré

$ echo $DEBUG
1

Et les variables d'environnement sont définies.

Élément de ʻenv_file dans docker-compose.yml`

Vous pouvez également écrire les variables d'environnement de ce conteneur dans un fichier séparé. Par exemple, dans un fichier appelé web-variables.env

web-variables.env


DEBUG=1
FOO=bar

Et écris

web-variables.env


web:
  env_file:
    - web-variables.env

Et, si vous spécifiez le fichier à lire dans l'élément de ʻenv_filedansdocker-compose.yml`, Dans le container

$ echo $DEBUG
1
$ echo $FOO
bar

Et les variables d'environnement sont définies.

De ce qui précède,

--Fichiers lus par ʻenv_file`

Vous pouvez voir que ** fonctionne complètement différent **.

Résumé

--$ ...dans docker-compose.yml est fondamentalement une variable d'environnement hôte, pas une variable facile à utiliser.

Comment êtes-vous entré dans ce problème?

Enfin, en cherchant, autant que possible pour aider ceux qui rencontrent des difficultés avec ce problème Voici comment je suis entré dans ce problème.

J'essayais d'utiliser les variables d'environnement dans docker-compose.yml comme des variables ordinaires

Selon le cas, la valeur à affecter à $ ... dans docker-compose.yml est utilisée correctement. J'ai souffert de ce fichier env_file et .env en essayant d'accommoder divers cas. À l'origine, vous devez diviser docker-compose.yml en utilisant l'option -f.

Je voulais définir le proxy pour docker-compose

Lorsque docker-compose sous un proxy, dans build de docker-compose, Vous devez définir des variables d'environnement pour le proxy telles que HTTP_PROXY dans le conteneur lancé.

Pour résoudre ce problème, vous pouvez définir l'élément build> args et l'élément ʻenvironment:dedocker-compose`. J'ai souffert de ce fichier env_file et .env ici.

Sur cette base, j'ai fait un article pour docker-compose sous le proxy.

Combinez les paramètres de proxy dans docker-compose en un seul fichier

Tentative d'utilisation du fichier .env avec le conteneur distant VSCode

Advanced Container Configuration | VSCode Dans la fonction de débogage à distance (conteneur distant) à l'aide du menu fixe de VSCode J'ai essayé de lancer un conteneur distant en spécifiant docker-compose.yml dans la section dockerComposeFile de devcontainer.json. À ce moment-là, j'ai essayé d'utiliser le fichier .env pour définir le proxy, Le fichier .env n'a pas pu être défini correctement dans le conteneur distant même dans le même dossier que docker-compose.yml.

La cause est comme mentionné ci-dessus Le fichier .env doit être dans le répertoire lorsque vous avez exécuté la commande ** docker-compose ** C'était ça.

Dans le conteneur distant, docker-compose est exécuté dans le répertoire racine de VSCode, donc J'ai mis le fichier .env dans le répertoire racine et cela a bien fonctionné. (Voir Github Microsoft VSCode issue # 222)

Recommended Posts

Différence entre le fichier env_file docker-compose et le fichier .env
Différence entre processus et travail
Différence entre régression et classification
Différence entre np.array et np.arange
Différence entre MicroPython et CPython
Différence entre ps a et ps -a
Différence entre return et print-Python
Différence entre Ruby et Python Split
Différence entre java et python (mémo)
Différence entre == et est en python
Mémorandum (différence entre csv.reader et csv.dictreader)
(Remarque) Différence entre la passerelle et la passerelle par défaut
Différence entre le randint de Numpy et le randint de Random
Différence entre tri et tri (mémorial)
Différence entre la série python2 et la série python3 dict.keys ()
[Python] Différence entre fonction et méthode
Différence entre SQLAlchemy flush () et commit ()
Python - Différence entre exec et eval
[Python] Différence entre randrange () et randint ()
[Python] Différence entre trié et trié (Colaboratoire)
Fonction pour ouvrir un fichier en Python3 (différence entre open et codecs.open et comparaison de vitesse)
[Xg boost] Différence entre softmax et softprob
différence entre les instructions (instructions) et les expressions (expressions) en Python
[Django ORM] Différence entre values () et only ()
Différences dans la relation entre PHP et Python enfin et quitter
Différence entre @classmethod et @staticmethod en Python
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
Différence entre la régression linéaire, la régression Ridge et la régression Lasso
[Python] Différence entre la méthode de classe et la méthode statique
[Python Iroha] Différence entre List et Tuple
[python] Différence entre la sortie rand et randn
Différence de vitesse entre wsgi, bouteille et flacon
Différence entre numpy.ndarray et list (dimension, taille)
Différence entre ls -l et la commande cat
Vérification de la différence et de la compatibilité entre keras et tf.keras # 1
Quelle est la différence entre «pip» et «conda»?
[Samba] Partage de fichiers mutuel entre les machines Linux et Windows
Différence entre l'utilisation et l'importation sur le langage de bouclier
[python] Différence entre variable et self. Variable dans la classe
À propos de la différence entre "==" et "is" en python
Création d'un nouveau fichier [Comparaison entre Bash et PowerShell]
À propos de la différence entre PostgreSQL su et sudo
Quelle est la différence entre Unix et Linux?
Prise en compte de la différence entre la courbe ROC et la courbe PR
Différence approximative entre Unicode et UTF-8 (et ses compagnons)
BERT peut-il comprendre la différence entre «Ame (bonbons)» et «Ame (pluie)»?
Expérience de comparaison de la vitesse d'écriture de fichier entre python 2.7.9 et pypy 2.5.0
Différence entre Ruby et Python en termes de variables
Différence entre la notation Numpy (n,) et (n, 1) [Différence entre le vecteur horizontal et le vecteur vertical]
Différence entre return, return None et no return description en Python
Comment utiliser argparse et la différence entre optparse
Différence centrale et différence avant
Entre paramétrique et non paramétrique
Modifiez le fichier de paramètres et exécutez docker-compose up (Django + MySQL ④)
Quelle est la différence entre les liens symboliques et les liens durs?
Module Python num2words Différence de comportement entre l'anglais et le russe
Python> Différence entre la sortie inpbt et print (inpbt)> [1. 2. 3.] / array ([1., 2., 3.], dtype = float32)
Comprendre la différence entre l'affectation cumulative aux variables et l'affectation cumulative aux objets
Méthode de concaténation de liste en python, différence entre list.extend () et opérateur «+»
Différence entre les back_populates et backref de SQL Alchemy et lorsque ni l'un ni l'autre n'est utilisé