Compose: Proposition: rendre le nom du projet persistant.

CrĂ©Ă© le 21 dĂ©c. 2014  Â·  274Commentaires  Â·  Source: docker/compose

Par défaut, Compose base le nom du projet sur le nom de base du répertoire compose
les commandes sont exĂ©cutĂ©es Ă  partir de. Le nom du projet peut ĂȘtre remplacĂ© soit par
passer une option -p / --project-name pour chaque commande ou définir le
COMPOSE_PROJECT_NAME variable d'environnement.

L'utilisation de l'option --project-name pour la commande _each_ est sujette aux erreurs et pour-
passer l'option en faisant (par exemple) docker-compose up , se traduira par
_une_ autre_ instance du projet en cours de crĂ©ation sous un nom diffĂ©rent ou mĂȘme
conteneurs d'un autre projet en cours de remplacement.

L'utilisation de la variable d'environnement COMPOSE_PROJECT_NAME n'est pas utile pour traiter
avec plusieurs projets et peut causer des problĂšmes similaires.

Proposition: rendre le nom du projet persistant

Pour résoudre ces problÚmes, compose enregistrera le nom d'un projet dans un fichier du
build-context lorsque le projet est démarré / construit pour la premiÚre fois.

Si un fichier-projet est trouvé, compose utilise automatiquement le nom-projet de ce
file et lĂšve une exception si l'utilisateur essaie de remplacer le nom du projet
en utilisant l'option --project-name .

Emplacement du fichier

Pour permettre une extension supplémentaire des options, compose crée un répertoire caché .docker-compose
dans le répertoire "racine" du contexte de construction. Dans ce répertoire, un
project-name fichier

tree -a
.
├── .docker-compose
│   └── project-name
└── docker-compose.yml

Demande de commentaire

Il reste quelques points Ă  discuter;

  • Le fichier de configuration doit-il ĂȘtre crĂ©Ă© _automatiquement_ ou doit-il
    ĂȘtre une action explicite de l'utilisateur (par exemple docker-compose init --project-name=foobar )
  • Une commande doit-elle ĂȘtre ajoutĂ©e Ă  _remove_ le (s) fichier (s) de configuration? (par exemple
    docker-compose destroy )
  • Compose permet de spĂ©cifier un fichier de composition alternatif ( --file ) si le
    project-name Ă©galement ĂȘtre appliquĂ© Ă  ceux-ci? Chaque fichier de composition doit-il avoir le sien
    configuration?

Et, dans un cadre plus large;

  • Le nom du projet est-il rĂ©ellement important? Sinon, compose pourrait crĂ©er un _random_
    nom-projet et stockez-le dans la configuration. Cela réduirait considérablement
    le risque de conflits de noms avec d'autres projets exĂ©cutĂ©s sur le mĂȘme serveur.

edit: renommé Fig en Compose

kinfeature statu0-triage

Commentaire le plus utile

Je pense en fait que le nom du projet est assez important. Si vous voulez pouvoir faire quoi que ce soit avec les images dans un pipeline CI, vous devez connaĂźtre le nom du projet pour pouvoir les renommer comme autre chose.

Le fait de pouvoir remplacer le nom du projet à partir des variables d'environnement permet de conserver ces variables uniques et prévisibles. Je pense que quoi qu'il arrive, nous devons prendre en charge le remplacement des variables d'environnement.

J'aime l'idĂ©e de rendre le nom du projet configurable Ă  partir d'un fichier. Je pense qu'une discussion similaire a eu lieu dans (# 45). Avoir le nom du projet dans .fig/project-name semble conduire Ă  beaucoup de trĂšs petits fichiers. Je pense qu'il serait plus facile de simplement le mettre dans le fig.yml lui-mĂȘme (comme cela est suggĂ©rĂ© dans # 45, et l'une des propositions de composition de docker).

Quels sont les avantages de le placer dans un répertoire et un fichier séparés?

Tous les 274 commentaires

Le nom du projet n'est pas important. J'aime l'idée d'un nom de projet aléatoire. Mieux encore - pourrions-nous générer un hachage du chemin vers fig.yml et l'utiliser?

Je pense en fait que le nom du projet est assez important. Si vous voulez pouvoir faire quoi que ce soit avec les images dans un pipeline CI, vous devez connaĂźtre le nom du projet pour pouvoir les renommer comme autre chose.

Le fait de pouvoir remplacer le nom du projet à partir des variables d'environnement permet de conserver ces variables uniques et prévisibles. Je pense que quoi qu'il arrive, nous devons prendre en charge le remplacement des variables d'environnement.

J'aime l'idĂ©e de rendre le nom du projet configurable Ă  partir d'un fichier. Je pense qu'une discussion similaire a eu lieu dans (# 45). Avoir le nom du projet dans .fig/project-name semble conduire Ă  beaucoup de trĂšs petits fichiers. Je pense qu'il serait plus facile de simplement le mettre dans le fig.yml lui-mĂȘme (comme cela est suggĂ©rĂ© dans # 45, et l'une des propositions de composition de docker).

Quels sont les avantages de le placer dans un répertoire et un fichier séparés?

La raison de le mettre dans un fichier séparé a un certain nombre de raisons, je vais essayer d'expliquer ma pensée derriÚre cela;

  • Pour conserver le nom qui a Ă©tĂ© utilisĂ© pour _dĂ©marrer_ le projet (ie, --project-name=foobar ), qui peut ĂȘtre diffĂ©rent du nom de projet automatique.
  • Avoir plusieurs instances ou _versions_ d'un projet en cours d'exĂ©cution sur le mĂȘme serveur, sans qu'elles ne soient en conflit
  • Ou, en bref, le .fig/project-name contient le nom de _cette instance_ du projet.

Peut-ĂȘtre que le fichier devrait s'appeler instance-name ou similaire.

J'aime l'idée de rendre le nom du projet configurable à partir d'un fichier

Bien que _possible_ de le faire avec cette proposition (en créant manuellement le fichier project-name ), mon cas d'utilisation principal était de demander à _fig_ de créer le fichier afin d'enregistrer le nom utilisé.

conduira Ă  beaucoup de trĂšs petits fichiers.

Certes, l'alternative est d'ignorer le rĂ©pertoire .fig , cependant, si des Ă©lĂ©ments supplĂ©mentaires sont nĂ©cessaires Ă  l'avenir, des fichiers supplĂ©mentaires peuvent ĂȘtre ajoutĂ©s sans encombrer la racine de votre projet. Git fait de mĂȘme et je pense que c'est une approche propre.

Je pense qu'il serait plus facile de le mettre simplement dans la fig.yml

Je pense que les deux options peuvent ĂȘtre complĂ©mentaires; utilisez le nom de fig.yml par dĂ©faut si le nom n'est pas remplacĂ© par un indicateur ou une variable d'environnement. Mettez le nom qui est rĂ©ellement utilisĂ© pour _dĂ©marrer_ le projet dans le .fig/project-name

Le fait de pouvoir remplacer le nom du projet à partir des variables d'environnement permet de conserver ces variables uniques et prévisibles. Je pense que quoi qu'il arrive, nous devons prendre en charge le remplacement des variables d'environnement.

Curieuse; comment gérez-vous la gestion de plusieurs projets? Ie cd project-a && fig ps puis cd project-b fig <something> ?

Merci pour vos commentaires!

Curieuse; comment gérez-vous la gestion de plusieurs projets?

Je lance généralement fig partir de python-tox , ce qui me permet de définir l'environnement, donc je ne le configure jamais vraiment dans mon shell. J'ai aussi tendance à utiliser tmux, donc j'ai des shells différents pour chaque projet.

Je pense que les deux options peuvent ĂȘtre complĂ©mentaires

Cool, je suis d'accord.

Je ne sais pas si je suis vendu sur .fig/instance-name vs disons .fig-instance.yml qui pourrait contenir des remplacements spécifiques à une instance, mais je pense que c'est plus un point mineur.

En pensant au nom du projet; Si je comprends bien votre situation, il est important de pouvoir contrÎler les _images_ produites, par exemple myapp:build12345 , ou également les noms des _conteneurs_? Juste pour avoir une "idée" de votre situation.

Ma pensée derriÚre les noms de projets "aléatoires" était que, tant que Fig est capable de localiser les conteneurs pour un projet, les noms attrayants ne sont pas importants. Si, en tant qu'utilisateur, je peux accéder au conteneur d'un service via son nom de service (par exemple fig stop web ), le nom du conteneur réel n'a pas d'importance.

J'ai mĂȘme pensĂ© que fig pourrait garder une trace des conteneurs par ID dans un stockage local Ă  l'intĂ©rieur du rĂ©pertoire .fig (ce qui pourrait ĂȘtre un gain de performance sur les machines avec beaucoup de conteneurs en cours d'exĂ©cution). Mais c'est vraiment quelque chose pour une question distincte.

Des rĂ©flexions sur la crĂ©ation "implicite" du fichier 'project-name' ou "explicitement" via fig init ? Peut-ĂȘtre que si j'ai un peu de temps pendant les vacances Ă  venir, je peux expĂ©rimenter un peu (jamais rien codĂ© en Python, donc ce sera _ vraiment_ expĂ©rimental :))

il est important de pouvoir contrĂŽler les images produites, par exemple myapp: build12345 , ou aussi les noms des conteneurs?

Je suppose que l'image est la plus importante, mais ĂȘtre en mesure de garantir que les noms de conteneurs ne sont pas en conflit est Ă©galement trĂšs important sur les hĂŽtes partagĂ©s. Je vois que cette proposition vise en fait Ă  traiter cette question Ă©galement.

Mais je pense que les noms prĂ©visibles des conteneurs sont toujours importants. Je peux penser Ă  quelques tĂąches oĂč il est important pour les systĂšmes externes (pas seulement fig) de pouvoir identifier un conteneur par son nom:

  • scripts de nettoyage pour supprimer les anciens conteneurs, ĂȘtre capable d'identifier quel projet a crĂ©Ă© un conteneur
  • dĂ©bogage / inspection des conteneurs

Les deux sont assez faciles pour le moment car je sais déjà quel sera le nom du conteneur. Si je dois chercher un nom, c'est un peu plus compliqué.

J'ai mĂȘme pensĂ© que fig pourrait garder une trace des conteneurs par ID dans un stockage local Ă  l'intĂ©rieur du rĂ©pertoire .fig

Il est vrai que cela pourrait ĂȘtre un gain de performances, mais je crains que ce ne soit la mauvaise approche. L'ajout d'un Ă©tat persistant Ă  fig introduit la possibilitĂ© de nombreux bogues (qui accompagnent l'Ă©tat). Je prĂ©fĂ©rerais de beaucoup voir cela gĂ©rĂ© par un systĂšme d'Ă©tiquetage dans dockerd. Si fig est capable d'Ă©tiqueter simplement les conteneurs, puis de rechercher tous les conteneurs avec cette Ă©tiquette, il conserve tout l'Ă©tat en un seul endroit (dockerd). Je sais qu'on en a parlĂ© Ă  un moment donnĂ©, je ne sais pas si cela figure sur la feuille de route.

Des réflexions sur la création "implicite" du fichier 'project-name' ou "explicitement" via fig init?

Je suppose que ce serait implicitement plus compatible avec les versions antérieures. Je voudrais éviter un fig init sauf si c'est absolument nécessaire. Au lieu d'utiliser le basedir, je pouvais le voir créer implicitement un nom de projet de <basename>-<4 digit random id>

Je peux seulement dire que si fig commence à générer des noms aléatoires maintenant, je vais m'en éloigner car je lance plus de 1000 conteneurs sur un seul hÎte et quand je ne peux plus les identifier par leur nom, ce n'est plus rien pour moi.

@ frank-dspeed merci d'avoir ajouté votre cas d'utilisation. Si je comprends bien, vous _démarrez_ vos conteneurs avec fig, mais _ les "gérez" _ directement via Docker aprÚs cela, en utilisant la convention de dénomination que Fig utilise?

Peut-ĂȘtre que cela vous intĂ©resse Ă©galement: https://github.com/docker/docker/pull/9882 - avoir des mĂ©ta-donnĂ©es offrirait plus de façons d'identifier les conteneurs, pas seulement leur nom.

ah oui j'ai beaucoup fait de telles propositions, par exemple en ajoutant simplement de nouveaux filds et ça mais j'ai fini dans ce cas avec simplement ajouter un ENV et puis j'ai ça comme costum fild je peux l'analyser: dart:

Je pense que la gestion de la clartĂ© du nom du projet ne devrait pas ĂȘtre la responsabilitĂ© de fig.

lorsque j'ai bien compris votre proposition, la génération d'un nom aléatoire rendrait les options FIG_PROJECT_VARIABLE et --project-name inutiles. ce qui est pratique pour les services de «création de modÚles».

Je pense que la gestion de la clartĂ© du nom du projet ne devrait pas ĂȘtre la responsabilitĂ© de fig.

Je ne suis pas si sĂ»r; Fig "silencieusement" Ă©craser les conteneurs d'un autre projet parce que s'il se trouve dans un rĂ©pertoire avec le mĂȘme nom est parfois dĂ©sagrĂ©able.

quand j'ai bien compris votre proposition, la génération d'un nom aléatoire rendrait la FIG_PROJECT_VARIABLE et l'option --project-name-option inutiles. ce qui est pratique pour les services de «création de modÚles».

Suite à la discussion ci-dessus, je pense que quelque chose comme ça fonctionnerait

  • Si --project-name est fourni, utilisez-le (et Ă©crivez / mettez Ă  jour le .project-name ? Pas sĂ»r)
  • Aucun --project-name n'est fourni, mais FIG_PROJECT_NAME est, utilisez FIG_PROJECT_NAME (et Ă©crivez / mettez Ă  jour vers .project-name ?)
  • Aucune des rĂ©ponses ci-dessus, mais .project-name est dĂ©fini, utilisez .project-name
  • Aucune de ces rĂ©ponses; crĂ©ez un nom _ alĂ©atoire_ et Ă©crivez-le dans .project-name

du point de vue de quelqu'un qui utilise fig dans des scripts qui prennent soin d'un nom et le transmettent Ă  fig, stocker un nom dans l'emplacement du projet (qui est dans mon cas plutĂŽt un modĂšle) n'a aucun sens.

et pourtant, j'ai senti trÚs intuitivement que le nom du répertoire est utilisé dans le nom des conteneurs résultants lorsque je viens de lancer fig up .
et disons, vous regardez docker ps -a , ce ne sera pas trÚs utile s'il est rempli de noms aléatoires.

Une option --random-name aiderait-elle dans votre situation?
à cÎté de cela, je pense que la possibilité d'ajouter des [a-zA-Z0-9_].* pour refléter un certain espace de noms serait utile pour des déploiements plus larges.

Pourquoi ne pas utiliser fig.yml pour stocker de telles informations?

schema-version: 1.1
project_name: foo
containers:
  web:
    build: .
   command: python app.py
    links:
     - db
    ports:
     - "8000:8000"
  db:
    image: postgres

Et pour garder BC, dans compose / project.py :: from_config

<strong i="9">@classmethod</strong>
    def from_config(cls, name, config, client):
        if 'schema-version' not in config:
            config = {
                'schema-version': '1.0',
                'containers': config
            }
        dicts = []
        for service_name, service in list(config.containers.items()):
            if not isinstance(service, dict):
                raise ConfigurationError('Service "%s" doesn\'t have any configuration options. All top level keys in your docker-compose.yml must map to a dictionary of configuration options.' % service_name)
            service['name'] = service_name
            dicts.append(service)
        return cls.from_dicts(name, dicts, client)

@jderusse Je suis trĂšs

de toute façon en venir à une résolution sur ce billet? Il semble que le # 1233 proposé vous donne le meilleur des deux mondes en laissant l'utilisateur décider de l'action envisagée à entreprendre sans rompre la rétrocompatibilité.

À l'origine, je voulais le nom dans le docker-compose.yml , mais aprĂšs y avoir rĂ©flĂ©chi davantage, j'aime beaucoup l'idĂ©e d'un fichier sĂ©parĂ©.

Un fichier sĂ©parĂ© vous donne la possibilitĂ© de le garder hors du contrĂŽle de version si vous le souhaitez (pour les cas oĂč vous souhaitez que chaque utilisateur puisse avoir un nom de projet diffĂ©rent).

Avec le nouveau support réseau, il y a une demande de fonctionnalité pour pouvoir également configurer le nom du réseau (il est par défaut le nom du projet). Donc, avec un fichier de configuration séparé, nous pourrions inclure des éléments comme le nom du réseau par défaut, l'échelle par défaut, etc. Toute la méta-configuration qui ne fait pas partie de la définition de l'application, mais qui est toujours pertinente pour l'exécution de la composition.

Je suis d'accord avec ce qu'a dit Dnephin. Que diriez-vous d'un fichier .docker-compose ? Nous pourrions y lister les options par défaut pour tous les arguments de ligne de commande.

@dnephin sgtm

@mikehaertl J'ai utilisé un dossier .docker-compose dans mon exemple, mais un fichier pourrait également fonctionner, en fonction de la quantité d'informations que nous voulons stocker

@thaJeztah Oh, d'accord, désolé. J'ai manqué ça.

@mikehaertl vient de les renommer de .fig Ă  .docker-compose ;-)

Droite :)

En fait, je préfÚre un simple fichier. Et le style ini? Options globales en haut, commande des options spécifiques dans une section:

project-name = blabla

[build]
no-cache

Quelques idĂ©es d'informations semi-liĂ©es que nous souhaitons peut-ĂȘtre stocker soit dans le mĂȘme fichier, soit dans le mĂȘme rĂ©pertoire:

  • nom du rĂ©seau (les utilisateurs peuvent souhaiter un nom de rĂ©seau diffĂ©rent du nom du projet. Nous avons dĂ©jĂ  reçu une demande pour cela.)
  • version de l'api du client
  • hĂŽte docker
  • valeur d'Ă©chelle par dĂ©faut

Maintenant que nous prenons en charge plusieurs fichiers de composition, il peut Ă©galement ĂȘtre intĂ©ressant d'inclure les chemins vers les fichiers de composition Ă  utiliser comme configuration.

version de l'api du client

Ă©ventuellement docker_host ?

Cela sonne aussi bien (ajouté)

Je viens de rencontrer ce problĂšme.

J'en suis Ă  un point oĂč la structure de base de notre configuration de docker a Ă©tĂ© rĂ©glĂ©e, et maintenant je la rĂ©plique vers d'autres services. Puisque tous les projets ont la mĂȘme structure, ils utilisent tous le mĂȘme sous-rĂ©pertoire (et par consĂ©quent, le nom de projet par dĂ©faut). Ce qui signifie que je ne peux pas mettre en file d'attente en toute sĂ©curitĂ© 2 services sur le mĂȘme hĂŽte.

Il se peut que je doive changer la structure pour que le nom du répertoire du projet soit la valeur par défaut, mais je ne suis pas sûr à 100% de ce que cela fait de la copie de fichiers au moment de la création de l'image.

Idem ici, j'ai rĂ©solu un problĂšme similaire avec les cibles Makefile . Mais quand mĂȘme, lorsque vous souhaitez exĂ©cuter des commandes personnalisĂ©es docker-compose , vous devez utiliser -p customname .

En ce moment, j'essaie de comprendre comment empĂȘcher les configurations de docker-compose dans /home/alice/myproject et /home/bob/myproject de marcher sur les conteneurs de l'autre. Existe-t-il un moyen de dĂ©river les noms de conteneurs Ă  partir du chemin d'accĂšs complet au fichier au lieu du seul nom du dernier rĂ©pertoire?

@ chris-martin Ceci est juste une solution de contournement ...

alias docker-compose="docker-compose -p ${PWD}"

docker-compose supprime / des noms de projet, cependant?

Les caractÚres autorisés dans les noms de projet sont-ils documentés?

J'ai fini par changer la structure de mes répertoires et mettre docker-compose.yml à la racine du projet, ce qui est une solution de contournement assez décente

Cela accorde une certaine protection, si vous avez tendance Ă  mettre tous vos rĂ©fĂ©rentiels git dans le mĂȘme rĂ©pertoire (par exemple, $ HOME ou $ HOME / projects), mais cela devient gĂȘnant si vous utilisez une autre structure (par exemple, un rĂ©pertoire par organisation, comme je souvent), ou si votre machine utilise boot2docker, qui a tendance Ă  divulguer des informations entre les utilisateurs sur la mĂȘme boĂźte, Ă  moins que vous ne veilliez Ă  ce que docker-machine vous donne des VM distinctes.

Je pense que # 2294 ou simplement ĂȘtre plus hygiĂ©nique avec docker-machine rĂ©soudrait Ă©galement mes problĂšmes.

Je recommanderais également de le mettre à la racine du projet et d'avoir un nom de dossier différent.

Dans mon cas, j'aimerais dĂ©finir le nom initial du projet car j'ai une machine partagĂ©e sur AWS et bien que j'ai le docker-compose.yml Ă  la racine, un utilisateur peut cloner le rĂ©fĂ©rentiel dans un rĂ©pertoire avec un nom diffĂ©rent. Si cela se produit actuellement, ils rencontrent des problĂšmes pour dĂ©marrer / arrĂȘter les conteneurs.

Avec la nouvelle syntaxe v2 cela pourrait ĂȘtre implĂ©mentĂ© comme mentionnĂ© dans https://github.com/docker/compose/issues/745#issuecomment -74028861

C'est en fait juste un container_name_prefix , n'est-ce pas?

@ schmunk42

C'est en fait juste un préfixe nom_conteneur, n'est-ce pas?

Il est également utilisé comme volume_name_prefix , image_name_prefix et network_name_prefix , donc je suppose que project_name est un terme plus générique.

.docker-compose semble familier à docker-compose.override.yml à bien des égards. De plus, pourquoi introduire un autre format de configuration (par exemple ini) alors que nous avons déjà YAML?
Je suis donc favorable à la suggestion de # 745 (commentaire) d'ajouter une clé project_name au docker-compose.yml , pour activer le cas d'utilisation de @JosephEarl.

La personnalisation spĂ©cifique Ă  l'utilisateur peut dĂ©jĂ  ĂȘtre implĂ©mentĂ©e en utilisant docker-compose.override.yml et en l'excluant via .gitignore .
Si un troisiÚme fichier de remplacement explicitement spécifique à l'utilisateur est souhaité, je suggérerais .docker-compose.local-override.yml .

En ce qui concerne la structure du YAML, je suggÚre de créer une nouvelle clé de niveau supérieur appelée project , qui contient project_name , et pourrait contenir d'autres variables à l'avenir. Cela évite de polluer l'espace de noms de niveau supérieur. Pour illustrer:

project:
  project_name: "your-project"
  network_prefix: "abc"

Notez qu'au lieu d'utiliser network_prefix , il peut ĂȘtre plus comprĂ©hensible de personnaliser directement les noms des rĂ©seaux eux-mĂȘmes. Si je comprends bien, il y a deux cas:

  • Le premier cas est "donnez simplement aux rĂ©seaux un nom unique, mais je me fiche de celui qui est exactement". Dans ce cas, project_name suffit.
  • L'autre cas concerne les rĂ©seaux auxquels se rĂ©fĂšrent des systĂšmes externes. Dans ce cas, il est probablement prĂ©fĂ©rable de spĂ©cifier explicitement les noms de rĂ©seau eux-mĂȘmes.

La proposition suggérée ci-dessus me semble bonne, je suis d'accord que nous ne voulons pas introduire de fichiers de configuration supplémentaires

+1 sur le concept de ce numéro
Mais aussi +1 sur l'utilisation d'une clé dans docker-compose.yml au lieu d'ajouter un autre fichier à nos dépÎts.

Pour résumer les commentaires précédents: Une proposition pour la séquence de recherche du nom du projet serait la suivante; les éléments précédents ont priorité sur les suivants:

  1. Utilisez --project-name si spécifié
  2. Utilisez COMPOSE_PROJECT_NAME si spécifié.
  3. Utilisez la clĂ© project_name partir de docker-compose.yml (ou partout oĂč ce paramĂštre est stockĂ©).
  4. Utilisez le basename du répertoire du projet

Je ne suis pas sûr de la priorité de 2 contre 3:

  • Par souci de cohĂ©rence avec --project-name , COMPOSE_PROJECT_NAME devrait dĂ©finitivement remplacer project_name: .
  • Mais: Faire de COMPOSE_PROJECT_NAME prioritĂ© sur project_name: permet d'utiliser accidentellement le mauvais nom de projet en raison de la variable d'environnement dĂ©finie; cela peut ĂȘtre difficile Ă  dĂ©boguer. Peut-ĂȘtre qu'un message d'avertissement peut poser problĂšme dans ce cas?

Pourquoi ne pas introduire une nouvelle propriété container_name_pattern avec la valeur par défaut %(project_name)s_%(service_name)s_%(instance_number)s pour conserver BC
ce paramÚtre nous permet de le changer en hardcodedproject_%(service_name)s_%(instance_number)s et de résoudre définitivement ce problÚme

Je viens d'arriver ce problÚme aprÚs avoir recherché cette fonctionnalité pendant 10 minutes.

La premiÚre chose que j'ai faite a été de rechercher la bonne clé dans le document de référence de fichier de composition, donc +1 pour project_name clé dans docker-compose.yml

: +1: pour la stratégie @ cr7pt0gr4ph7

+1 pour la stratégie @ cr7pt0gr4ph7

Compose a une syntaxe pour la substitution d'environnement. PlutĂŽt que d'utiliser une variable d'environnement pour le nom du projet, peut-ĂȘtre laisser les gens le faire eux-mĂȘmes s'ils s'en soucient?

D'un autre cĂŽtĂ©, la machine docker utilise la fin pour dĂ©cider sur quelle machine une compilation de composition sera construite, donc peut-ĂȘtre que le nom du projet et la cible devraient fonctionner de la mĂȘme maniĂšre. Hmm, c'est difficile.

https://github.com/docker/compose/issues/745#issuecomment -182296139 sonne bien. La variable d'environnement a priorité sur la valeur du fichier de composition, qui agit par défaut (en supposant que le nom du projet appartient au fichier de composition).

Quelque chose à considérer, que se passe-t-il lorsque vous utilisez plusieurs fichiers de composition qui définissent chacun un nom de projet?

Je ne pense pas que ce devrait ĂȘtre une erreur, qui forcerait les fichiers Ă  ĂȘtre soit "primaires", soit "extras", ce qui n'est pas le cas actuellement. Tout fichier peut ĂȘtre utilisĂ© isolĂ©ment ou en combinaison avec d'autres.

Peut-ĂȘtre qu'un avertissement est raisonnable, ou peut-ĂȘtre que nous l'ignorons complĂštement (puisque la valeur peut ĂȘtre ignorĂ©e en dĂ©finissant Ă©galement une option ou une variable d'environnement).

Quelque chose à considérer, que se passe-t-il lorsque vous utilisez plusieurs fichiers de composition qui définissent chacun un nom de projet?

Si vous faites quelque chose comme docker-compose -f compose1.yml -f compose2.yml up et que les deux fichiers dĂ©finissent le nom du projet, le nom utilisĂ© doit ĂȘtre de compose2.yml .

Je pense que tout le monde est sur une solution que j'aime déjà: -) Ie project_name dans docker-compose.yaml. Je veux juste mentionner un autre cas d'utilisation pour avoir le nom du projet dans le fichier docker-compose.yaml:

Dans les pages HTTP 500 Internal Server Error de mon projet, je dis au dĂ©veloppeur comment rĂ©soudre ou dĂ©panner le problĂšme, par exemple je lui dis qu'il / elle peut zcat database-dump.tgz | docker exec -i projectname_db_1 psql si le serveur remarque qu'aucune base de donnĂ©es PostgreSQL et l'utilisateur a Ă©tĂ© crĂ©Ă© - et ensuite je veux choisir moi-mĂȘme projectname , sinon les messages d'aide ne peuvent pas ĂȘtre copiĂ©s dans la console.

Acceptez qu'il devrait y avoir un avertissement lorsque COMPOSE_PROJECT_NAME remplace le nom du projet dans le compose.yml - ce comportement est logique en fonction des commandes Docker existantes, mais n'est pas particuliĂšrement logique ou Ă©vident pour un nouveau venu.

+1 pour la stratégie @ cr7pt0gr4ph7

J'ai essayĂ© de chercher quelque chose avant d'ouvrir un problĂšme moi-mĂȘme car je ne trouvais rien.
+1 pour project_name dans le fichier docker.compose.yml. Avec la v2, je suppose que cela a de plus en plus de sens.

Acceptez qu'il devrait y avoir un avertissement lorsque COMPOSE_PROJECT_NAME remplace le nom du projet dans le compose.yml - ce comportement est logique en fonction des commandes Docker existantes, mais n'est pas particuliĂšrement logique ou Ă©vident pour un nouveau venu.

C'est un comportement assez normal pour les variables d'environnement de remplacer les paramĂštres de configuration et pour les arguments de ligne de commande de remplacer les paramĂštres de configuration et les variables d'environnement.
Avons-nous vraiment un avertissement pour cela? Ce n'est pas comme si quelqu'un créait accidentellement une variable d'environnement nommée COMPOSE_PROJECT_NAME .

Serait-il acceptable de créer un PR qui utilise simplement le project_name de docker-compose.yml pour y arriver? Ou voulons-nous des trucs supplémentaires comme l'utilisation de la project_name du dernier fichier yml référencé immédiatement?

Que dis-tu de ça?

version: "2"
project:
    default_name: "app"

Je changerai mon implémentation (https://github.com/docker/compose/pull/3118) pour ce format. Mais je ne suis pas sûr que la section project soit nécessaire ....

+1 ĂȘtre dĂ©sireux de voir cette fonctionnalitĂ©

@timgriffiths , il semble que cela soit possible dans la derniĂšre RC en ajoutant un fichier d'environnement Ă  votre projet:

@deizel J'ai donc regardé le fichier d'environnement, mais je pense toujours qu'il y a un bon cas d'utilisation pour pouvoir définir le nom du projet dans le fichier de composition.

Dans notre situation, nous avons Prod, Staging, UAT, Dev composent des fichiers juste pour que nous puissions dĂ©marrer une version diffĂ©rente de notre pile d'applications, et parfois nous voulons mettre en place un environnement Staging et UAT sur le mĂȘme essaim, afin que je puisse utiliser l'environnement variables ou quoi que ce soit, mais cela dĂ©pend de l'utilisateur qui se souvient tous de dĂ©finir cela, oĂč, comme si c'Ă©tait dans le fichier de composition, tout serait archivĂ© dans le dĂ©pĂŽt et nous pourrions tout garder en ligne et simple Ă  expliquer Ă  tous les utilisateurs.

+1 Nous avons une situation oĂč notre fichier de composition a des rĂ©fĂ©rences Ă  des volumes distants prĂ©configurĂ©s. Compose ajoute automatiquement le nom du projet aux noms de volume dont le montage Ă©choue en raison de noms incompatibles. Le fait de pouvoir dĂ©finir explicitement le nom du projet dans le fichier yml de composition rendrait la convention de dĂ©nomination beaucoup plus Ă©vidente pour les autres personnes impliquĂ©es dans le projet plutĂŽt que de masquer les variables d'environnement dans des fichiers externes obscurs qui pourraient varier d'un environnement Ă  l'autre.

@edevenport dans votre cas, vous pouvez utiliser l'option externe des volumes nommés:

# docker-compose.prod.yml
volumes
  dbdata:
    external:
      name: my-project-db-data

Merci @fesor - J'aurais dû entrer plus en détail. Je suis en train de monter des volumes glusterfs en utilisant une configuration similaire à celle-ci:

    ...
    volumes:
      - media:/data/media:ro

volumes:
  media:
    driver: glusterfs

Dans ce cas, media devient projectname_media sur l'hĂŽte et ne parvient pas Ă  monter Ă  moins que le volume glusterfs ne soit crĂ©Ă© Ă  l'avance avec le nom du projet. J'avais pensĂ© monter manuellement les volumes glusterfs sur l'hĂŽte et utiliser external dans le fichier docker-compose, mais je prĂ©fĂ©rerais ne pas avoir Ă  le faire manuellement sur tous les nƓuds Ă  l'avance.

@edevenport Je comprends cela. Mais vous pouvez simplement ajouter ce volume manuellement avec docker volume create et l'utiliser:

    volumes:
      - media:/data/media:ro

volumes:
  media:
    external:
      name: my-glusterfs-media

Il n'est donc pas nécessaire de changer de projet et de supprimer les préfixes.

Le cas de @timgriffiths est quelque chose de plus complexe, et il n'a aucune solution de contournement. J'utilise un wrapper simple autour de docker-compose juste pour ne pas me souvenir des noms de projet.

@fesor donc nous avons contourné le problÚme en collant simplement les fichiers de composition dans des noms de dossier descriptifs, cela contourne cette limitation. Mais ce serait trÚs agréable de le voir ajouté dans les versions ultérieures

@timgriffiths J'ai fait un PR (https://github.com/docker/compose/pull/3118) - peut-ĂȘtre que cela aiderait. Mais cela ne gĂšre pas votre cas si vous avez plusieurs fichiers de composition.

@fesor que les relations publiques seraient parfaites, est-ce une possibilité de les fusionner?

Maintenant, Compose fournit un fichier d'environnement , de sorte que le nom du projet peut y ĂȘtre conservĂ©.

@mkuzmin c'est triste qu'il y ait COMPOSE_FILE mais il n'y a pas de COMPOSE_OVERRIDE_FILE .

@fesor AFAIK vous pouvez spécifier plusieurs fichiers

@ schmunk42 Je pourrais spécifier le nom du projet non plus. Mais cela ne résout pas le problÚme. Je veux avoir dans le script de déploiement quelque chose comme ceci:

docker-compose up -d

au lieu de

docker-compose -f $COMPOSE_FILE -f $COMPOSE_OVERRIDE_FILE \
            up -d

COMPOSE_PROJECT_NAME dans l'exemple ci-dessus est spécifié par CI. Et une fonctionnalité comme .env file est cool mais ... inutile en cas de persistance du nom du projet.

J'utilise .env pour DRY env variables (et pour docker-compose <1.7 j'ai un simple wrapper), mais cela ne résout aucun autre problÚme. @timgriffiths a déjà souligné le cas avec déploiement sur un cluster d'essaim.

COMPOSE_FILE=one.yml:two.yml explique comment définir plusieurs fichiers. Donc, incluez simplement le fichier de remplacement dans $COMPOSE_FILE

@dnephin a raté cette fonctionnalité, cool.

Eh bien ... à propos du déploiement swarm, je gÚre déjà cela via COMPOSE_PROJECT_NAME dans les variables ENV de mon travail de jenkin, donc des problÚmes uniquement avec le déploiement manuel. Et mon implémentation ne permet pas de remplacer le nom de projet par défaut, donc ...

Ce problĂšme date de presque 2 ans et n'est toujours pas rĂ©solu. Je me demande ce qui empĂȘche l'Ă©quipe des dockers d'ajouter enfin un correctif appropriĂ©. Est-il vraiment si difficile d'ajouter une nouvelle directive de configuration simple pour les fichiers docker-compose.yml ?

Bien que la solution de contournement avec .env soit agrĂ©able, elle n'est pas toujours utilisable (le fichier .env peut dĂ©jĂ  ĂȘtre utilisĂ© par votre application). Et c'est aussi toujours une solution de contournement.

Et j'ai mĂȘme vu d'autres nouveaux problĂšmes qui peuvent ĂȘtre liĂ©s au nom du projet s'insinuer dans les derniĂšres versions (# 3966).

Alors, quel est vraiment le problĂšme?

Est-il vraiment si difficile d'ajouter une nouvelle directive de configuration simple pour les fichiers docker-compose.yml ?

Non! Le problĂšme n'a jamais Ă©tĂ© la difficultĂ© de mise en Ɠuvre.

Bien que la solution de contournement avec .env soit agrĂ©able, elle n'est pas toujours utilisable (le fichier .env peut dĂ©jĂ  ĂȘtre utilisĂ© par votre application). Et c'est aussi toujours une solution de contournement.

Ce n'est pas une solution de contournement, c'est une solution! Le fichier .env contient des variables d'environnement qui doivent ĂȘtre lues par Compose. Si vous avez des variables d'environnement qui doivent ĂȘtre lues par votre application, placez-les dans un autre fichier (disons app.env ) et rĂ©fĂ©rencez-le en utilisant l'option env_file .

Alors, quel est vraiment le problĂšme?

L'ajout du nom du projet à un fichier docker-compose.yml le rend moins portable, ce que nous ne voulons pas encourager. Maintenant qu'il existe un moyen (avec .env ) de spécifier de maniÚre persistante le nom du projet sans sacrifier la portabilité de docker-compose.yml , le cas pour l'ajouter en tant qu'option de configuration est plus faible. C'est la principale raison pour laquelle ce problÚme n'a pas bougé.

L'ajout du nom du projet Ă  un fichier docker-compose.yml le rend moins portable,

Cela ne pourrait-il pas ĂȘtre facultatif? Personnellement, je ne vĂ©rifie jamais mon docker-compose.yml mais je ne fournis qu'un docker-compose-example.yml dans mon repo que je peaufine localement. Par exemple, pendant le dĂ©veloppement, je peux ajouter des variables d'environnement supplĂ©mentaires ou mapper des volumes supplĂ©mentaires dans mon conteneur. Pourquoi ne pas nous donner Ă©galement la possibilitĂ© de spĂ©cifier le nom du projet?

Suite à votre argumentation, vous devez également déplacer toutes les options network vers .env car elles ne sont généralement pas du tout portables et dépendent de la configuration réseau de votre machine hÎte.

En d'autres termes: qu'est-ce qui rend le nom du projet si spécial? Il existe déjà de nombreuses autres options dans le docker-compose.yml qui ne sont pas vraiment portables. Pourquoi ne pas donner au développeur la possibilité de choisir ce qui convient le mieux à son cas d'utilisation?

Je pense Ă©galement que l'option devrait ĂȘtre offerte. À mesure que l'utilisation de Docker se rĂ©pand, les projets avec un seul dĂ©veloppeur utilisant la conteneurisation dans leur flux de travail deviendront de plus en plus courants. Dans ces cas d'utilisation, le nom du projet Ă©tant constant est trĂšs bien. Un bon exemple d'un autre projet permettant une telle flexibilitĂ© est vagabond avec leur Vagrantfile . Ils se rendent compte qu'il existe certainement des cas d'utilisation pour les grandes Ă©quipes, mais reconnaissent Ă©galement les scĂ©narios de dĂ©veloppeur de loup solitaire.

Je pense que la mise en Ɠuvre d'une option de nom de projet ici est importante pour l'adoption. Cela pourrait dĂ©courager les dĂ©veloppeurs solo qui ne se soucient pas d'une "stratĂ©gie de configuration de nom de projet Ă©volutive".

L'ajout du nom du projet à un fichier docker-compose.yml le rend moins portable, ce que nous ne voulons pas encourager. Maintenant qu'il existe un moyen (avec .env) de spécifier de maniÚre persistante le nom du projet sans sacrifier la portabilité de docker-compose.yml, les arguments pour l'ajouter en tant qu'option de configuration sont plus faibles. C'est la principale raison pour laquelle ce problÚme n'a pas bougé.

Comment l'ajout du nom du projet au docker-compose.yml rend-il moins portable?

IMHO c'est en fait le contraire, comme le montre # 3966 crĂ©Ă© par @mikehaertl. Ce problĂšme montre clairement que ne pas avoir le nom du projet stockĂ© dans docker-compose.yml rend les choses en fait moins portables (comme dans: avoir une plus grande probabilitĂ© d'entrer en conflit avec d'autres projets de composition dĂ©marrĂ©s Ă  partir de la mĂȘme machine) puisque Compose repose sur une convention sur le nom du dossier du conteneur que beaucoup de gens, du moins au dĂ©but, ne connaĂźtront pas.

L'ajout d'un fichier .env ajoute non seulement une chose supplémentaire à apprendre pour les nouvelles personnes qui souhaitent adopter Compose, mais puisque je devrais également l'ajouter à mon repo à cÎté de docker-compose.yml pour éviter cela collisions Je ne vois pas en quoi ce serait différent du point de vue de la portabilité que de simplement définir le nom du projet dans docker-compose.yml .

Je suis également pour ajouter le nom dans docker-compose.yml. Le fichier .env est utilisé dans d'autres frameworks que j'utilise et il est important qu'il reste hors du référentiel. Cependant, pour maintenir des conteneurs localisés dans mes développeurs, moins ils en savent sur docker (au début), mieux c'est. Je veux un point d'entrée simple qui n'entrera pas en conflit avec d'autres projets. Je ne veux pas expliquer pourquoi les choses sont telles qu'elles sont. Juste un simple

clone repo
docker-composer

Ma solution de contournement consiste maintenant à créer le fichier proposé par @ schmunk42 .

Le conteneur lui-mĂȘme ne devrait pas se soucier du nom du projet. Pourquoi utiliser les variables d'environnement comme un mĂ©canisme uniquement destinĂ© Ă  l'hĂŽte?

J'adorerais voir le support pour cela dans le fichier docker-compose.yml . Si on a besoin de le dĂ©finir via une variable d'environnement, il peut ĂȘtre dĂ©fini dans le fichier .env (s'il n'est pas dĂ©fini directement sur l'hĂŽte) et utilisĂ© via une substitution de variable dans le fichier docker-compose.yml .

Si les conteneurs nommés sont autorisés, pourquoi les projets nommés ne seraient-ils pas autorisés?

Le cas d'utilisation oĂč une dĂ©finition de nom de projet dans le fichier .yml serait utile est le suivant:
Nous avons le mĂȘme fichier docker-compose pour diffĂ©rents serveurs Web (diffĂ©rentes informations d'identification de base de donnĂ©es, diffĂ©rents volumes de donnĂ©es, quelques petites diffĂ©rences comme le logo, etc.). Il existe 3 services par application en cours d'exĂ©cution, et ils sont configurĂ©s dans un fichier de composition. Lorsque plusieurs serveurs sont exĂ©cutĂ©s l'un Ă  cĂŽtĂ© de l'autre, il serait bien de voir quel service appartient Ă  quel projet.

La substitution de variable dans le nom du conteneur est pratique, avec le $ COMPOSE_PROJECT_NAME comme préfixe. Eh bien, je comprends la solution .env-file, mais cela ne la rend pas plus «conviviale pour les développeurs» dans un environnement de déploiement (CI).

Avoir un conteneur de kill docker-compose d'un docker-compose totalement différent parce qu'il n'y avait pas de jeu de variables -p ou d'environnement et que vous avez créé le docker-compose dans un sous-dossier "docker" est un bogue critique à mon avis.

Il y a tout simplement trop de place pour l'erreur dans les déploiements sérieux. Oubliez simplement de spécifier le nom du projet, que ce soit dans -p, .env ou ailleurs: vous vous déconnectez pendant un certain temps jusqu'à ce que vous remarquiez ce qui s'est passé. Pire encore: le service en collision est déconnecté, pas celui sur lequel vous travaillez. Vous passerez une bonne journée :(

@dnephin Qu'est-ce qui

Peut-ĂȘtre suis-je le seul ici Ă  avoir des inquiĂ©tudes Ă  ce sujet, mais quoi qu'il en soit.
Dans notre configuration, nous modifions uniquement les fichiers .env et app.env pour changer d'environnement, mais cela repose sur le fait d'avoir plusieurs fichiers et de fusionner les fichiers yml .

Si cela est mis en Ɠuvre, pensez à BC.

Par exemple. si un nom de projet est défini dans docker-compose.yml et .env ce dernier doit avoir la priorité. Sinon, les personnes qui comptent sur la gestion de cela via .env , rencontrent des problÚmes similaires avec des piles qui se chevauchent, comme avec le flux de travail actuel et en s'appuyant sur les noms de dossier.

@ schmunk42 Nous ne disons pas que la fonctionnalitĂ© .env doit ĂȘtre supprimĂ©e. Si vous prĂ©fĂ©rez avoir le nom de votre projet dans .env ne le configurez tout simplement pas dans docker-compose.yml .

Mais d'autres préfÚrent l'avoir dans leur docker-compose.yml comme le montre clairement la discussion ici. Ils devraient pouvoir le faire, s'ils le souhaitent. C'est une fonctionnalité facultative. Ce qui prévaut si les deux sont configurés est une question de définition d'une convention simple.

Srsly, veuillez ajouter des projets nommés. Cas d'utilisation:
Projet un:
docker-compose up --build --remove-orphans

  • nginx
  • contenu statique
    Projet deux:
    docker-compose up --build --remove-orphans
  • nginx
  • contenu statique

Lorsque le projet 2 démarre, il tue les conteneurs du projet avec une sortie 137 (code 128 + niveau 9).

Maintenant, je dois exĂ©cuter docker system prune et reconstruire les rĂ©seaux chaque jour pour m'empĂȘcher d'avoir des dizaines de conteneurs morts.

export COMPOSE_PROJECT_NAME=somethingnew

Quelqu'un de l'équipe principale peut-il enfin expliquer ce qui retarde cette fonctionnalité? C'est tellement frustrant, comment les choses qui sont si faciles à réparer sont bloquées sans raison.

Le seul argument jusqu'à présent était de garder le portable docker-compose.yml . Cela n'a aucun sens, car

  • le nom du projet dans le fichier du compositeur ne le rend plus automatiquement portable
  • tout le monde n'a mĂȘme pas cette exigence

    • nous avons dĂ©jĂ  d'autres options qui peuvent limiter la portabilitĂ© de la mĂȘme maniĂšre: networks , port , ...

Tout dépend beaucoup du cas d'utilisation spécifique. Mais ce n'est pas parce que certains ne veulent pas de cette option que tout le monde doit suivre son opinion!

@mikehaertl Vous avez déjà des noms de projet persistants. Il suffit de mettre le fichier .env et d'y définir la variable COMPOSE_PROJECT_NAME . Je ne vois plus aucun avantage dans le nom du projet dans le fichier de composition.

@fesor Je n'ai généralement pas .env fichiers docker-compose.yml .

@fesor : Je pense que @thasmo a raison Ă  ce sujet. Le nom du projet doit avoir la possibilitĂ© d'ĂȘtre spĂ©cifiĂ© dans le fichier compose.yml car s'il est pertinent pour tous les dĂ©veloppeurs utilisant le projet, il doit ĂȘtre dans le contrĂŽle de version.

@fesor Je suis désolé, mais je ne pense pas que la préférence personnelle soit un véritable argument. La vraie question n'est pas de savoir pourquoi nous ne voulons pas utiliser .env ou une variable d'environnement. C'est l'inverse: pourquoi n'a-t-il pas été mis dans le fichier de configuration à sa place?

Presque toutes les options que vous pouvez passer Ă  docker sur la ligne de commande peuvent ĂȘtre spĂ©cifiĂ©es dans ce fichier. Seul le nom du projet est exclu pour certaines raisons mystĂ©rieuses. Est-ce une forme d'apartheid parmi les arguments? : PI revendique l'Ă©galitĂ© des droits pour tous! Laissez le dĂ©veloppeur dĂ©cider et ne lui imposez pas de contraintes artificielles.

Et encore: personne ne vous enlÚve l'ancienne option - nous ne voulons finalement que cette option supplémentaire. C'est juste.

@dnephin : Il semble que vous et tout le monde ĂȘtes satisfaits de la solution indiquĂ©e dans le raffinement de ce problĂšme par

Seriez-vous prĂȘt Ă  accepter une pull request qui l'implĂ©mente, ou avez-vous l'intention de demander Ă  l'un des responsables de l'Ă©crire?

@ cr7pt0gr4ph7

@dnephin @fesor ayant le nom du projet dans le * compose.yml facilite un schéma de configuration unifié

Je ne vois pas pourquoi le nom du projet est important. Aucune partie du fichier de configuration ne doit reposer sur un nom de projet spécifique.

La seule qualité importante du nom du projet est qu'il n'est pas en conflit avec le nom d'un autre projet, ce qui est en fait un argument contre son insertion dans le fichier docker-compose.yml . Un développeur sur un projet utilisera souvent un nom de répertoire différent pour chaque projet, donc la valeur par défaut est souvent correcte pour la plupart des cas d'utilisation.

Lorsque la valeur par dĂ©faut n'est pas correcte, le dĂ©veloppeur peut la remplacer ( -p , ou COMPOSE_PROJECT_NAME ), qui peut ĂȘtre soit des alias, soit ĂȘtre placĂ©e dans le fichier .env .

Je ne suis pas contre un fichier de projet qui dĂ©finirait le nom du projet, je voudrais juste comprendre pourquoi cette fonctionnalitĂ© est si critique pour certains. Si c'est parce que le fichier Compose nĂ©cessite un nom de projet spĂ©cifique, je vois cela comme un problĂšme distinct qui devrait ĂȘtre traitĂ© diffĂ©remment,

Je voulais avoir 4 fichiers de composition dans 1 répertoire. Le nom du répertoire est incorrect par défaut ici. La seule option que j'ai est .env qui ne fonctionne que pour 1 fichier de composition dans 1 répertoire.

_Pourquoi j'Ă©carte COMPOSE_PROJECT_NAME et -p: _
Le COMPOSE_PROJECT_NAME et le -p ne sont pas à mon avis sauvegardés en production car vous devez vous rappeler de les définir. Ou créez un script de démarrage et n'oubliez pas de ne pas utiliser directement la composition de docker. Lorsque la personne A s'appuie sur ce mécanisme et que la personne B ne le sait pas, c'est un certain échec.
(Je l'ai déjà détaillé ci-dessus)

@dnephin Pour moi et mon Ă©quipe, la logique d'application est gĂ©nĂ©ralement stockĂ©e dans un dossier htdocs dans notre dossier de projet. Cela nous permet de conserver d'autres documents / ressources liĂ©s ensemble dans un mĂȘme rĂ©pertoire. En tant que dĂ©veloppeur travaillant avec des dĂ©veloppeurs distants. Il est facile pour moi de leur faire adopter Docker si je n'ai rien Ă  assumer sur la structure de leurs dossiers. Je l'ai dit dans le passĂ©, .env n'est pas une option pour moi car il ne fait gĂ©nĂ©ralement pas partie du repo que nous partageons tous.

Je ne vois pas pourquoi le nom du projet est important. Aucune partie du fichier de configuration ne doit reposer sur un nom de projet spécifique.

Il m'est arrivé plus d'une fois que j'ai fait un 'docker-composer vers le bas' sur un hÎte - et j'ai fait descendre un conteneur différent de celui que je voulais! Juste parce que je ne me souvenais pas, qu'il y avait aussi une configuration dans un fichier .env .

La seule qualité importante du nom du projet est qu'il n'est pas en conflit avec le nom d'un autre projet, ce qui est en fait un argument contre son insertion dans le fichier docker-compose.yml. Un développeur sur un projet utilisera souvent un nom de répertoire différent pour chaque projet, donc la valeur par défaut est souvent correcte pour la plupart des cas d'utilisation.

C'est peut-ĂȘtre vrai pour vous - ce n'est pas pour moi et pour beaucoup d'autres. La structure de mon application est comme myapp/app/docker-compose.yml . Ainsi, toutes mes applications partagent le nom du rĂ©pertoire app . Et j'ai plus d'un conteneur sur un hĂŽte.

Lorsque la valeur par dĂ©faut n'est pas correcte, le dĂ©veloppeur peut la remplacer (-p ou COMPOSE_PROJECT_NAME), qui peut ĂȘtre soit des alias, soit ĂȘtre placĂ©e dans le fichier .env.

SĂ©rieusement, je commence Ă  avoir l'impression d'ĂȘtre dans un roman de Kafka ici. N'est-il pas Ă©vident que vous pouvez mettre pratiquement toutes les options de ligne de commande pour docker dans un docker-compose.yml - Ă  l'exception de cette seule grande exception?

Au lieu de nous demander encore et encore et d'ignorer nos réponses, pourquoi quelqu'un ne peut-il pas enfin justifier la résistance. Et non: "... mais je n'en ai pas besoin" n'est pas un argument valable!

@dnephin J'ai plusieurs projets dans leurs propres dépÎts git et afin de garder les répertoires du projet racine propres, j'ai mis tous les éléments liés au docker dans un sous-dossier appelé docker (le contexte de construction devient simplement .. , tout fonctionne à merveille).

Pour exécuter plusieurs projets sur un seul serveur, je dois actuellement créer docker/.env.dist dans chaque repo et cp docker/.env.dist docker/.env aprÚs git clone . Sinon, le nom du projet est juste docker , ce que je ne veux évidemment pas. Dans quelques cas, .env contient des mots de passe, etc., donc la copie de .env.dist est de toute façon nécessaire, mais dans la plupart des cas .env existe simplement parce qu'il n'y a aucun moyen de définir COMPOSE_PROJECT_NAME en docker-compose.yml .

Je comprends qu'il peut y avoir des problĂšmes dans la maniĂšre dont les conteneurs sont dĂ©marrĂ©s et arrĂȘtĂ©s si le mĂȘme COMPOSE_PROJECT_NAME est utilisĂ© deux fois dans docker-compose.yml , mais cela se produit dĂ©jĂ  si j'oublie de copier .env.dist ou lorsque j'attribue accidentellement le mĂȘme nom dans deux fichiers .env sur le mĂȘme serveur. Pour moi, ce serait idĂ©al si je pouvais dĂ©finir default_compose_project_name droit dans docker-compose.yml , puis remplacer la valeur dans .env si, disons que je veux exĂ©cuter une copie intermĂ©diaire d'un projet . Ce serait 100% BC, mais plus pratique.

Je l'ai dit dans le passé, .env n'est pas une option pour moi car il ne fait généralement pas partie du repo que nous partageons tous.

Peut-ĂȘtre que c'est la cause principale de tout cela, j'ai dĂ©jĂ  dit que docker-compose "a dĂ©tournĂ©" ce fichier et nous avons Ă©tĂ© obligĂ©s de renommer nos trucs en app.env .

Peut-ĂȘtre que docker-compose.env aurait Ă©tĂ© le bon choix.

FWIW: Nous ne changeons que les fichiers .env en production, les fichiers yml sont fusionnés avec un docker-compose.override.yml si nécessaire.

Une solution de contournement consiste également à définir vos fichiers yml de maniÚre à ce qu'ils ne démarrent pas sans un fichier .env , par exemple. en utilisant une variable image: $IMAGE .

Ceci est une solution de contournement pour mes 4 fichiers docker-compose dans 1 cas de répertoire ci-dessus @ schmunk42 ? Vraiment?

@RobIsHere Mais vous devez quand mĂȘme utiliser -f , non?

En réponse à @dnephin dans ce commentaire :

Je ne vois pas pourquoi le nom du projet est important.

C'est important car cela affecte le nom des conteneurs Docker que docker-compose gÚre. Si vous oubliez de définir le nom du projet, docker-compose ps ne trouvera pas les conteneurs que vous avez créés auparavant avec docker-compose --project-name <project_name> up -d <container_name> .

De plus, lorsque vous exĂ©cutez la commande globale docker ps , le nom du projet sera inclus dans la liste des conteneurs en cours d'exĂ©cution, vous savez donc d'oĂč ils viennent. Par exemple, si vous testez plusieurs projets de code Ă  la fois qui utilisent tous MySQL et qu'ils ont chacun un conteneur mysql , alors docker ps affichera une liste ambiguĂ« de conteneurs. Ainsi, le nom du projet est important dans le contexte de nombreux projets Docker s'exĂ©cutant sur la mĂȘme machine.

Aucune partie du fichier de configuration ne doit reposer sur un nom de projet spécifique.

Devoir définir le nom du projet à un endroit différent de _toutes les autres variables associées au projet Docker Compose_ n'a pas de sens.

La seule qualité importante du nom du projet est qu'il n'est pas en conflit avec le nom d'un autre projet, ce qui est en fait un argument contre son insertion dans le fichier docker-compose.yml.

Pour les raisons exposées dans mon premier paragraphe, ce n'est pas la _ "seule qualité importante du nom du projet" _. C'est pour la facilité d'utilisation et la compréhension.

Un développeur sur un projet utilisera souvent un nom de répertoire différent pour chaque projet, donc la valeur par défaut est souvent correcte pour la plupart des cas d'utilisation.

Dans le cas autre que celui par dĂ©faut oĂč un dĂ©veloppeur place _tous_ les fichiers Docker liĂ©s dans le rĂ©pertoire docker , ce qui est un moyen parfaitement raisonnable d'organiser un projet Docker, la magie qui dĂ©finit le nom du projet crĂ©era des noms de projet en conflit. Ainsi, les mĂȘmes conflits que vous Ă©voquez se produisent dans ce cas particulier. Vous n'avez pas besoin de protĂ©ger le dĂ©veloppeur contre les collisions de nom de projet lorsqu'il dĂ©finit de toute façon explicitement le nom du projet.

Lorsque la valeur par dĂ©faut n'est pas correcte, le dĂ©veloppeur peut la remplacer (-p ou COMPOSE_PROJECT_NAME), qui peut ĂȘtre soit des alias, soit ĂȘtre placĂ©e dans le fichier .env.

La dĂ©finition des variables d'environnement est un niveau supplĂ©mentaire de complexitĂ© qui n'est pas nĂ©cessaire. Lorsque vous partagez un projet entre dĂ©veloppeurs avec le contrĂŽle de version, il est logique de n'utiliser que des fichiers. Avoir Ă  inclure des paramĂštres de ligne de commande Ă  chaque appel est fastidieux et sujet aux erreurs. Et le fichier .env ne peut pas ĂȘtre partagĂ© dans le contrĂŽle de version car il est censĂ© contenir des variables spĂ©cifiques Ă  l'utilisateur et non spĂ©cifiques au projet. Par consĂ©quent, les mĂ©thodes actuelles pour dĂ©finir un nom de projet sont insuffisantes.

Je ne suis pas contre un fichier de projet qui dĂ©finirait le nom du projet, je voudrais juste comprendre pourquoi cette fonctionnalitĂ© est si critique pour certains. Si c'est parce que le fichier Compose nĂ©cessite un nom de projet spĂ©cifique, je vois cela comme un problĂšme distinct qui devrait ĂȘtre traitĂ© diffĂ©remment,

Toutes les variables qui affectent le fonctionnement de docker-compose doivent aller au mĂȘme endroit, le fichier docker-compose.yml . Les mĂ©thodes actuelles de dĂ©finition d'un nom de projet introduisent une complexitĂ© inutile.

Presque tous les abonnés à ce numéro sont d'accord avec ces points.

L'ajout de la possibilitĂ© de dĂ©finir le nom du projet dans docker-config.yml n'entrera mĂȘme pas en conflit avec les fonctionnalitĂ©s actuelles. Il n'y a aucune raison de ne pas le mettre en Ɠuvre.

@ schmunk42 La derniÚre fois que j'ai vérifié, docker ne nous a pas permis de choisir le nom de notre fichier .env. Ai-je manqué quelque chose (il est difficile de suivre les changements). Le changer en quelque chose comme docker-compse.env le corrigerait pour mon cas d'utilisation. Le problÚme que j'ai est que j'utilise deux technologies trÚs populaires qui nécessitent toutes deux un fichier .env. Le framework PHP Laravel ne suit pas ce fichier dans le référentiel et dans les environnements de production, il n'existe parfois pas.

J'ai trouvé que c'était un véritable bloc de stubbling lors de la premiÚre adoption de Docker, car comme @RobIsHere l' illustre. Tous mes répertoires de projets sont au format myapp/htdocs/docker-compose.yml . Au début, en adoptant Docker, j'ai accidentellement supprimé d'autres conteneurs que je n'avais pas l'intention de faire. Il serait préférable que docker nomme son projet au hasard plutÎt que d'utiliser le nom du dossier dans mon cas.

J'ai plusieurs autres dĂ©veloppeurs distants qui commencent Ă  adopter Docker. En tant qu'Ă©quipe, il m'est toujours plus facile de demander Ă  ces dĂ©veloppeurs de toujours / seulement docker-compose up pour faire fonctionner ces applications. Moins ces premiers utilisateurs en savent sur Docker, mieux c'est. Une fois qu'ils verront le pouvoir derriĂšre cela, ils reprendront d'eux-mĂȘmes.

Donc, pour rĂ©sumer, les cas d'utilisation semblent ĂȘtre ceux oĂč la valeur par dĂ©faut n'est pas appropriĂ©e. Il existe dĂ©jĂ  des moyens de remplacer la valeur par dĂ©faut, mais ceux-ci peuvent ĂȘtre sujets aux erreurs et ne pas ĂȘtre Ă©vidents pour les premiers utilisateurs.

Les cas oĂč la valeur par dĂ©faut n'est pas appropriĂ©e sont:

  • plusieurs fichiers de composition dans le mĂȘme rĂ©pertoire (vous oblige dĂ©jĂ  Ă  spĂ©cifier -f pour les exĂ©cuter)
  • en utilisant le mĂȘme nom de rĂ©pertoire pour tous les projets (je suppose que cela vous oblige Ă©galement Ă  spĂ©cifier -f , la solution de contournement possible est d'utiliser un nom de rĂ©pertoire unique).

@dnephin j'ajouterais, une pierre d'achoppement en moins possible pour les premiers utilisateurs de Docker.

@dnephin Vous avez également eu ces préoccupations dans ce commentaire :

À l'origine, je voulais le nom dans le fichier docker-compose.yml, mais aprĂšs y avoir rĂ©flĂ©chi davantage, j'aime beaucoup l'idĂ©e d'un fichier sĂ©parĂ©. Un fichier sĂ©parĂ© vous donne la possibilitĂ© de le garder hors du contrĂŽle de version si vous le souhaitez (pour les cas oĂč vous souhaitez que chaque utilisateur puisse avoir un nom de projet diffĂ©rent).

Définir l'ordre de priorité de résolution des noms de projet comme ceci résoudra ce problÚme (les plus grands nombres remplacent les plus petits):

  1. docker-compose.yml
  2. La variable d'environnement COMPOSE_PROJECT_NAME
  3. L'option de ligne --project-name commande

La derniÚre fois que j'ai vérifié, docker ne nous a pas permis de choisir le nom de notre fichier .env.

@fiveanddone AFAIK vous ne pouvez pas faire cela, mais cela ne ferait que déplacer le problÚme, car vous devrez alors savoir de quel fichier ENV vous auriez besoin pour le projet.

Dans notre cas avec phd5 , nous avons déplacé le (app) -environment vers src/ et .env est uniquement le "control-environment-file", j'ai essayé d'expliquer cela ici .
Je n'aime pas ça et je ne l'aurais pas changĂ© tout seul. Je sais que cela pourrait ne pas ĂȘtre possible pour beaucoup de projets.
Mais avoir un .env de votre application au mĂȘme niveau que votre docker-compose.yml devient super ennuyeux, car a) vous obtenez des variables dans votre "environnement de contrĂŽle" qui n'y appartiennent pas et b) vous devez transmettre ces variables Ă  votre conteneur, si vous en avez besoin et c) vous ne pouvez plus les remplacer / les modifier dans votre fichier app.env .

@dnephin Pourquoi ne pas introduire docker-compose.env comme fichier env prĂ©fĂ©rĂ© et utiliser .env comme solution de secours. Vous avez fait la mĂȘme chose avec fig.yml une fois.

Je ne pense pas que cela rĂ©sout le problĂšme pour tout le monde. La dĂ©nomination du fichier .env me semble ĂȘtre un problĂšme diffĂ©rent.

Je pense que le nƓud du problùme est le suivant:

La conception originale de docker-compose up Ă©tait d'ĂȘtre une seule (courte) commande que vous pouviez exĂ©cuter pour faire fonctionner les services. C'est ce que les dĂ©veloppeurs en attendent. Cependant, ce comportement ne peut pas ĂȘtre atteint pour certains utilisateurs (dans ces cas ).

Il existe de nombreuses façons de contourner le problÚme, mais aucune ne semble fonctionner pour tout le monde.

Je pense que l'ordre de prioritĂ© (du plus Ă©levĂ© au plus bas) doit ĂȘtre quelque chose comme ceci:

  1. --project-name (remplace toujours)
  2. COMPOSE_PROJECT_NAME variable d'environnement
  3. Une valeur par défaut définie par l'utilisateur, distincte de tout fichier versionné
  4. Une valeur par dĂ©faut dĂ©finie par le projet, qui peut ĂȘtre archivĂ©e
  5. Le nom du répertoire (par défaut lorsque rien n'est spécifié)

(3) pourrait ĂȘtre rĂ©alisĂ© avec un fichier .docker/project-name (comme proposĂ© dans l'OP)
(4) pourrait ĂȘtre rĂ©alisĂ© avec un champ dans le fichier docker-compose.yml

Il est regrettable qu'il doive y avoir autant de façons différentes de définir le nom du projet.

@dnephin concernant 3, laisser un utilisateur définir une valeur par défaut, c'est à cela que servent les variables d'environnement, pas besoin de créer un fichier

Hmm ... Et si nous gĂ©nĂ©ralisions un peu le problĂšme et introduisions simplement la section default_environment dans docker-compose.yml ? De cette façon, nous pourrons dĂ©finir COMPOSE_PROJECT_NAME sans introduire de champ spĂ©cial dans le yaml, mais nous pourrons Ă©galement dĂ©finir d'autres variables par dĂ©faut, qui sont susceptibles d'ĂȘtre prĂ©sentes ailleurs dans le fichier. Cela rĂ©duira le nombre de cas oĂč .env.dist doit ĂȘtre copiĂ© dans .env et le coĂ»t de l'oubli sera moindre.

Exemple d'utilisation:

# ~/projects/sketches/sketch-42/docker/docker-compose.yml
version: "2"
default_environment:
  - SUBDOMAIN=sketch-42
  - ROOT_HOST=example.com
  - COMPOSE_PROJECT_NAME=sketch-42
services:
  web:
    build:
      context: ../
      dockerfile: docker/Dockerfile
    environment:
      - VIRTUAL_HOST=${SUBDOMAIN}.${ROOT_HOST},www.${SUBDOMAIN}.${ROOT_HOST}
      - VIRTUAL_PORT=80
      - VIRTUAL_NETWORK=proxy
      - LETSENCRYPT_HOST=${SUBDOMAIN}.${ROOT_HOST},www.${SUBDOMAIN}.${ROOT_HOST}
      - LETSENCRYPT_EMAIL=admin@${ROOT_HOST}
    restart: always
    networks:
      - proxy

networks:
  proxy:
    external:
      name: proxy

Ce yaml est trĂšs similaire Ă  ce que j'ai trĂšs souvent - il dĂ©crit un croquis vis, qui a toujours un service appelĂ© web , mais peut Ă©galement ĂȘtre sauvegardĂ© par un mini serveur API et peut-ĂȘtre un conteneur avec une base de donnĂ©es. On suppose que https://github.com/jwilder/nginx-proxy se trouve Ă  l'avant de tout et Ă©coute les vrais ports 80 et 443.

Pour le moment, peu importe si je suis sur une machine locale ou sur un serveur distant, je dois me rappeler de maintenir .env et aussi de m'assurer que toutes les variables d'environnement y sont définies. Si, disons, j'ai oublié SUBDOMAIN , le conteneur démarre, mais le serveur Web reste en panne.

Avec la section default_environment Ă  ma disposition, je pourrais avoir toutes mes variables de production en place dans un seul fichier et je n'aurais pas Ă  copier .env.dist sur le serveur. Sur la machine locale, dans l'exemple ci-dessus, je mettrais simplement une seule variable dans .env , ce qui serait ROOT_HOST=example.com.dev (ou peut-ĂȘtre que je pourrais mĂȘme export ROOT_HOST=example.com.dev dans le profil bash? )

Pour résumer, la section default_environment dans docker-compose.yml peut non seulement résoudre le problÚme dont nous discutons actuellement, mais peut également permettre quelques astuces supplémentaires, tout en étant 100% BC et facile à comprendre!

WDYT?

Cela semble bien, cela peut ĂȘtre utile pour moi dans certains scĂ©narios.

Cependant, sachez qu'à la lumiÚre de la discussion (animée) ci-dessus, votre
solution se traduit en gros par ceci: «Au lieu d'ajouter un nouveau fichier à la
yml, que diriez-vous d'ajouter une nouvelle section? " :)

Le mar 28 fĂ©vrier 2017, 00:02 Alexander Kachkaev [email protected]
a Ă©crit:

Hmm ... Et si nous généralisions un peu le problÚme et introduisions simplement
section default_env dans docker-compose.yml. De cette façon nous définissons
COMPOSE_PROJECT_NAME sans introduire de champ spécial dans le yaml, mais
sera Ă©galement capable de dĂ©finir d'autres variables par dĂ©faut, susceptibles d'ĂȘtre
présent ailleurs tout au long du dossier. Cela réduira le nombre de cas
lorsque .env.dist doit ĂȘtre copiĂ© dans .env et le coĂ»t de l'oubli de
le faire sera moins.

Exemple d'utilisation:

~ / projects / sketches / sketch-42 / docker / docker-compose.yml

version 2"
default_env:
SOUS-DOMAINE = sketch-42
ROOT_HOST = example.com
COMPOSE_PROJECT_NAME = sketch-42
prestations de service:
la toile:
construire:
le contexte: ../
dockerfile: docker / Dockerfile
environnement:
- VIRTUAL_HOST = $ {SUBDOMAIN}. $ {ROOT_HOST}, www. $ {SUBDOMAIN}. $ {ROOT_HOST}
- VIRTUAL_PORT = 80
- VIRTUAL_NETWORK = proxy
- LETSENCRYPT_HOST = $ {SUBDOMAIN}. $ {ROOT_HOST}, www. $ {SUBDOMAIN}. $ {ROOT_HOST}
- LETSENCRYPT_EMAIL = admin @ $ {ROOT_HOST}
redémarrer: toujours
réseaux:
- Procuration

réseaux:
Procuration:
externe:
nom: proxy

Ce yaml est trÚs similaire à ce que j'ai trÚs souvent - il décrit un vis
sketch, qui a toujours un service appelĂ© web, mais peut Ă©galement ĂȘtre sauvegardĂ©
par un mini serveur API et peut-ĂȘtre un conteneur avec une base de donnĂ©es. Il est supposĂ©
que https://github.com/jwilder/nginx-proxy est assis Ă  l'avant et Ă©coute
aux ports réels 80 et 443.

Pour le moment, peu importe si je suis sur une machine locale ou sur un serveur distant,
Je dois me rappeler de maintenir .env et aussi de m'assurer que tout
les variables d'environnement y sont définies. Si, disons, j'ai oublié
SUBDOMAIN, le conteneur démarre, mais le serveur Web reste en panne.

Avec la section default_env Ă  ma disposition, je pourrais avoir toute ma production
variables en place et je n'aurais pas Ă  copier .env.dist sur le serveur.
Sur la machine locale, je mettrais juste une variable dans .env, ce qui serait
ROOT_HOST = example.com.dev (ou peut-ĂȘtre que je pourrais mĂȘme exporter
ROOT_HOST = example.com.dev dans le profil bash?)

Pour résumer, la section default_env de docker-compose.yml ne peut pas seulement
résoudre le problÚme dont nous discutons maintenant, mais peut également permettre une utilisation plus agréable
scénarios!

WDYT?

-
Vous recevez ceci parce que vous ĂȘtes abonnĂ© Ă  ce fil.
RĂ©pondez directement Ă  cet e-mail, affichez-le sur GitHub
https://github.com/docker/compose/issues/745#issuecomment-282885661 , ou muet
le fil
https://github.com/notifications/unsubscribe-auth/AAQJJZumr10j3i17gPxrSyA-n8CwvsXTks5rg1X_gaJpZM4DLBNs
.

Avoir le "nom_projet" dans le fichier docker-compose.yml résoudrait un problÚme avec notre pile.
Nous avons un référentiel monolithique avec une arborescence standardisée gérant plusieurs projets, qui ressemble plus ou moins à ceci:

projectA/infrastructure/docker-compose.yml
projectB/infrastructure/docker-compose.yml
...

C'est évidemment plus complexe que cela dans le monde réel, nous ne pouvons donc pas simplement déplacer le fichier docker-compose.yml vers le dossier "projectA / projectB".

Nous avons une CLI à la racine qui demande quels projets démarrer, et comme le nom du projet dépend directement du dossier parent de docker_compose.yml, nous sommes confrontés à des conflits.

Comme nous n'Ă©crivons pas nous-mĂȘmes la commande docker-compose (enveloppĂ©e dans notre script CLI), nous ne pouvons pas simplement ajouter l'argument "-p" Ă  la commande manuellement.
Une solution pour nous serait de toujours générer un nom_projet dans le script CLI afin que nous ayons toujours un "-p" lors de l'appel de docker-compose, basé sur le chemin absolu, mais cela semble bizarre.

Un gars ici a dit "ça marche la plupart du temps" parce que sur la plupart des projets, le docker-compose.yml est situĂ© dans le dossier racine du projet, et les projets ont un nom diffĂ©rent, Ă©vitant les conflits ", je ne peux pas ĂȘtre d'accord sur ce. Ce n'est pas toujours dans le dossier racine.

Pourquoi est-il possible de dĂ©finir le "nom_conteneur" dans un fichier docker-compose.yml (dĂ©sactivation de la mise Ă  l'Ă©chelle) pour un service, mais ne peut pas dĂ©finir un "nom_projet" pour le fichier docker-compose.yml lui-mĂȘme, au mĂȘme niveau que "version" / "services" / "rĂ©seaux" / "volumes"?

Cela semble nécessaire avec l'utilisation de scale pour que les noms de conteneurs soient évidents. (par exemple <project_name>_<container_name>_1 ).

Cela vous aidera lors de l'utilisation du nom du conteneur pour dns.

Je suis venu ici en espérant que cela soit fait. Gauche déçu. 3 ans +

Ouais, c'est l'un des problÚmes de convivialité les plus stupides de Docker et cela reste sans réponse.

Nous avons passĂ© tellement de temps Ă  nous disputer avec les dĂ©veloppeurs Ă  ce sujet, et mĂȘme s'il y avait consensus, personne n'a admis que c'Ă©tait une mauvaise conception.

C'est frustrant car il y a un support utilisateur évident pour cela, mais comme cela ne correspond pas aux propres cas d'utilisation des développeurs, nous sommes en train de ressasser cette année aprÚs année.

Quel est l'intĂ©rĂȘt de docker-compose si nous devons ajouter des options Ă  l'aide de cli?
J'ai eu quelques conteneurs écrasés grùce au schéma de nommage.

Aujourd'hui, je mettais en place un autre projet docker-compose avec un autre fichier .env pour donner au projet un nom persistant. J'ai donc pensé vérifier ce problÚme depuis quelques années depuis ma derniÚre vérification. Mais rien de nouveau ici pour autant que je puisse voir? Je suppose que je vais devoir continuer à utiliser la solution .env contournement

Devoir spĂ©cifier le nom du projet en externe (par ligne de commande ou variable) mais ĂȘtre incapable de le dĂ©finir dans le fichier docker-compose.yml - le fichier qui spĂ©cifie absolument tout le reste - est tout simplement insensĂ©. Il existe de nombreux cas oĂč un processus peut avoir besoin d'adresser une pile de services spĂ©cifique basĂ©e sur un fichier arbitraire docker-compose.yml indĂ©pendamment du nom du rĂ©pertoire parent, de l'environnement shell ou de la prĂ©sence d'une ligne spĂ©cifique dans un .env spĂ©cifique docker-compose.yml pour que mes travaux puissent l'extraire et l'utiliser.

Cela semble se produire maintes et maintes fois avec ce projet. Docker est une technologie merveilleuse, mais parfois je me demande si les développeurs ont réellement une expérience du monde réel, ou sont-ils tous des hackers de 18 ans qui pensent qu'ils savent le mieux? Les gens veulent utiliser ces trucs pour un vrai travail, pas passer leur temps constamment à chercher des solutions de contournement.

Je suppose que l'Ă©quipe ignore entre-temps ce problĂšme. Essayer de convaincre les dĂ©veloppeurs de docker peut ĂȘtre une vraie douleur pour le dire lĂ©gĂšrement.

Les arguments clairs sont contrĂ©s par une logique Ă©trange qui n'a pas beaucoup de sens. L'opinion des utilisateurs du monde rĂ©el qui viennent tous ici pour la mĂȘme raison est ignorĂ©e. C'est dommage.

Je ne veux pas que mes travaux CI doivent continuellement «comprendre» le nom du projet - il devrait ĂȘtre clairement indiquĂ© dans le fichier docker-compose.yml afin que mes travaux puissent l'extraire et l'utiliser.

Avez-vous le problĂšme que votre pile s'appelle "build1234" et / ou comment aimeriez-vous utiliser le nom de la pile Ă  un autre endroit, comme docker exec build1234_myservice script.sh ?


Cela ne convient peut-ĂȘtre Ă  aucun cas d'utilisation, mais pour l'avoir dit ...

Dans nos configurations, nous ne modifions .env lors de la configuration d'un projet (cloné). Si nous avons besoin de modifications ou d'une configuration dynamique, nous réutilisons les variables de .env dans docker-compose.yml . Un avantage est que docker-compose vous avertit (ou échoue) si une variable est manquante.

Je ne veux pas vous dire que vous devez modifier vos flux de travail, car j'ai également été ennuyé par ce problÚme.
C'est essentiellement quelque chose comme, nous traitons les changements de docker-compose.yml plus comme des changements de code source, tandis que .env est uniquement la configuration. Mais je suis Ă©galement d'accord qu'il existe plusieurs options dans docker-compose.yml , comme network qui dĂ©pendent fortement du projet. Revenant Ă  ce qui prĂ©cĂšde; Je dĂ©finirais une variable .env pour le rĂ©seau. đŸ€

Je ne veux pas vous dire que vous devez modifier vos flux de travail, car j'ai également été ennuyé par ce problÚme.

J'ai encore rĂ©flĂ©chi Ă  ma propre situation. Je n'ai pas de problĂšme avec la dĂ©finition externe du nom du projet, et en fait je le fais avec l'indicateur -p <project_name> , ce qui permet d'isoler des instances uniques de la pile dans CI et d'exĂ©cuter plusieurs piles simultanĂ©ment si nĂ©cessaire. Seule cette chaĂźne CI a besoin de connaĂźtre ce nom de projet afin qu'il puisse ĂȘtre gĂ©nĂ©rĂ© automatiquement ou alĂ©atoire (mais connu), pas de problĂšme. Je n'ai pas non plus de problĂšme avec l'utilisation d'une variable d'environnement pour remplacer le nom par dĂ©faut, mais je trouve que l'astuce .env n'est pas Ă©vidente.

Cependant, il existe d'autres situations oĂč il est utile d'avoir le _ nom par dĂ©faut_ du projet explicitement dĂ©fini quelque part. Alors pourquoi prend-il le nom du rĂ©pertoire parent comme source de ce nom? Tel est, pour moi, le point faible ici. Il pourrait ĂȘtre pris de n'importe oĂč - le choix d'un rĂ©pertoire parent semble juste arbitraire et sans grande raison (par exemple dans presque tous mes projets, le fichier docker-compose.yml trouve dans un sous-rĂ©pertoire appelĂ© docker ). Donc, si cela doit ĂȘtre arbitraire, stockez-le dans un endroit plus explicite, comme le fichier yml, plutĂŽt que de crĂ©er des effets secondaires externes en influençant les noms de rĂ©pertoire parent qui, dans de nombreux cas, devraient ĂȘtre complĂštement indĂ©pendants du contenu du rĂ©pertoire (basĂ© sur des annĂ©es d'expĂ©rience de travail avec des ressources rĂ©utilisables).

Il pourrait ĂȘtre pris de n'importe oĂč - le choix d'un rĂ©pertoire parent semble simplement arbitraire et sans grande raison (par exemple dans presque tous mes projets, le fichier docker-compose.yml se trouve dans un sous-rĂ©pertoire appelĂ© docker).

Si vous avez besoin d'autre chose qu'un identifiant alĂ©atoire, je ne vois aucune alternative rĂ©elle au rĂ©pertoire parent. Au moins, vous avez la chance de savoir d'oĂč «vient» votre pile.
Mais je suis également d'accord avec vous, car dans nos projets, nous testons des piles dans des dossiers tests qui - sans un fichier .env - se heurteraient également fortement les uns aux autres. C'est pourquoi j'ai proposé de préférer un fichier appelé docker-compose.env qui serait beaucoup plus clair à mon humble avis.

Voulez-vous simplement fermer ce bogue en admettant que vous ne vous en souciez pas, ou implémenter la chose incroyablement simple que la grande majorité d'entre nous souhaite? C'est 2,86 ans plus tard. Sortez du pot. Prenez vos décisions ou corrigez vos erreurs. Comment vous voulez le regarder. Faites plus que rien.

@matsaman et toutes les personnes qui donnent son commentaire le pouce levé:

Voulez-vous simplement fermer ce bogue en admettant que vous ne vous en souciez pas, ou implémenter la chose incroyablement simple que la grande majorité d'entre nous souhaite? C'est 2,86 ans plus tard. Sortez du pot. Prenez vos décisions ou corrigez vos erreurs. Comment vous voulez le regarder. Faites plus que rien.

Qui ĂȘtes-vous les gars? En open source, la communautĂ© possĂšde les dĂ©cisions et corrige les erreurs des autres. Docker est open source. Envisagez de soumettre une pull request au lieu de pleurnicher.

Je suis moi aussi triste que cela n’ait pas encore Ă©tĂ© mis en Ɠuvre. Mais, en open source, nous contribuons ou attendons patiemment.

Argument CLI:

$ cd foo
$ docker-compose up
$ docker-compose -p bar up
... some time later wanting to take down bar forgetting '-p'
$ docker-compose down
Stopping foo_nginx_1 ... done
Stopping foo_mysql_1 ... done
Removing foo_nginx_1 ... done
Removing foo_mysql_1 ... done
$ FU@$_!@*#%$(!_*@
-bash: FU@!@*#%$: command not found

Échouer.

Fichier Env:

$ cd foo
$ source foo.env
$ docker-compose up
$ source bar.env
$ docker-compose up
... some time later wanting to take down foo forgetting to `source .foo.env`
$ docker-compose down
Stopping bar_nginx_1 ... done
Stopping bar_mysql_1 ... done
Removing bar_nginx_1 ... done
Removing bar_mysql_1 ... done
$ FU@$_!@*#%$(!_*@
-bash: FU@!@*#%$: command not found

Échouer.

Solutions proposées avec le nom du projet dans le fichier yml:

$ cd foo
$ docker-compose -f foo.yml up
$ docker-compose -f bar.yml up
... some time later
$ docker-compose down
ERROR:
        Can't find a suitable configuration file in this directory or any
        parent. Are you in the right directory?

        Supported filenames: docker-compose.yml, docker-compose.yaml

Yay!

$ COMPOSE_PROJECT_NAME=foo docker-compose up -d
$ COMPOSE_PROJECT_NAME=bar docker-compose up -d
... some time later
$ docker-compose down -v
Removing network project_default
WARNING: Network project_default not found.

O /

Qui ĂȘtes-vous les gars?

@benjaminwood Ce sont les responsables de ce projet. Votre argument aurait du sens si nous parlions d'un changement complexe et que personne ne trouverait le temps de le faire.

Ce n'est pas le cas ici assez Ă©vident: l'implĂ©mentation serait probablement trĂšs facile pour ceux qui connaissent la base de code et beaucoup plus difficile pour quelqu'un de l'extĂ©rieur. Ce n'est donc pas que personne n'ait le temps de le faire, mais plutĂŽt que les responsables ne veulent pas le faire. Et c'est ce que les supporters ici trouvent extrĂȘmement ennuyeux, Ă©tant donnĂ© la longue pĂ©riode pendant laquelle ce numĂ©ro est ouvert maintenant et la masse de: +1: ici.

Les solutions de contournement publiées encore et encore ici sont toutes bien connues mais ne s'appliquent pas à tout le monde. Et je ne trouvais toujours pas de réponse à la question de savoir pourquoi, de toutes choses, presque seul le nom du projet était omis dans les fonctionnalités de docker-compose.yml . Si quelqu'un pense que cela n'a pas sa place, alors ne l'utilisez pas! Mais n'obstruez pas votre opinion sur les autres si la demande est si évidente.

Voyons cela d'un autre point.

Si je suis dans un dossier contenant un fichier docker-compose.yml , comment puis-je trouver le nom de projet de ma pile?
C'est une question assez basique, mais il n'y a pas de réponse facile.

Actuellement, c'est (trié par priorité):

  • la valeur de -p
  • la valeur de COMPOSE_PROJECT_NAME de votre environnement
  • la valeur de COMPOSE_PROJECT_NAME de votre fichier .env
  • le nom du rĂ©pertoire courant

Pour ĂȘtre l'avocat du diable, pourquoi ajouter un 5Ăšme Ă  cette configuration dĂ©jĂ  dĂ©routante?

Malgré la décision de cela, il devrait y avoir une information «exécutable à sec» sur le nom actuel. Ni docker-compose config n'a cela, ni docker-compose ps si la pile n'est pas en cours d'exécution.
Peut-ĂȘtre que docker-compose create est la meilleure option actuellement disponible, mais loin d'ĂȘtre parfaite.

Il devrait y avoir au moins quelque chose comme docker-compose config --project-name . Actuellement, j'ai besoin de connaßtre les emplacements ci-dessus et de les vérifier dans le bon ordre.

Si je me trouve dans un dossier contenant un fichier docker-compose.yml, comment puis-je trouver le nom de projet de ma pile?

Encore une fois: si vous ne voulez pas l'utiliser, ne l'utilisez pas! Si vous ĂȘtes satisfait de votre solution, tant mieux! Rien ne changera pour vous, vous ne serez donc pas du tout confus!

Mais ne pouvez-vous pas accepter que les autres aient des exigences différentes? Tout ce que nous voulons, c'est que cette piÚce logiquement manquante soit enfin ajoutée.

Pour ĂȘtre l'avocat du diable, pourquoi ajouter un 5Ăšme Ă  cette configuration dĂ©jĂ  dĂ©routante?

La seule raison pour laquelle cela peut prĂȘter Ă  confusion est que le nom du projet a Ă©tĂ© laissĂ© en dehors de docker-compose.yml en premier lieu. Sinon, tout serait dans ce fichier maintenant. Nous pouvons dĂ©finir une liste de prioritĂ© - pas un problĂšme.

Actuellement, j'ai besoin de connaßtre les emplacements ci-dessus et de les vérifier dans le bon ordre.

Pourquoi ne connaissez-vous pas le nom du docker de votre projet et pourquoi est-ce mĂȘme pertinent pour vous? Et pourquoi n'utilisez-vous pas le mĂȘme mĂ©canisme dans tous vos projets si cela vous dĂ©route tellement?

Encore une fois: si vous ne voulez pas l'utiliser, ne l'utilisez pas! Si vous ĂȘtes satisfait de votre solution, tant mieux! Rien ne changera pour vous, vous ne serez donc pas du tout confus!

Ma question ne portait pas sur l'utilisation d'une nouvelle fonctionnalitĂ©, mais sur l'absence d'une fonctionnalitĂ© existante. Le nom du projet est la seule et unique information pertinente que docker-compose utilise pour dĂ©marrer et arrĂȘter un certain ensemble de conteneurs.
Les personnes de ce thread se plaignent d'avoir tué les mauvais conteneurs, car le nom du projet ne fait pas partie de la pile.

Mais ne pouvez-vous pas accepter que les autres aient des exigences différentes? Tout ce que nous voulons, c'est que cette piÚce logiquement manquante soit enfin ajoutée.

Si vous ajoutez cela, les gens se plaindront de tuer les mauvais conteneurs, car ils font partie de la pile, car ils utilisaient auparavant le nom du répertoire.

La seule raison pour laquelle cela peut prĂȘter Ă  confusion est que le nom du projet a Ă©tĂ© laissĂ© en dehors de docker-compose.yml en premier lieu. Sinon, tout serait dans ce fichier maintenant. Nous pouvons dĂ©finir une liste de prioritĂ© - pas un problĂšme.

En fait, vous ne pouvez pas l'ajouter de maniÚre BC, car il devrait avoir une priorité inférieure en tant que nom de répertoire, ce qui le rendrait inutile. C'est pourquoi je demandais "comment obtenir le nom du projet".

Pourquoi ne connaissez-vous pas le nom du docker de votre projet et pourquoi est-ce mĂȘme pertinent pour vous?

Parce que j'utilise généralement le nom du répertoire, mais parfois une valeur personnalisée dans .env - c'est pertinent car le nom du projet définit les conteneurs sur lesquels les actions sont exécutées.

cd /some/path/test
docker-compose up -d
cd /a-completely-different-path
docker-compose -p test down -v --remove-orphans

Cela tuera votre premiĂšre pile, ce serait la mĂȘme chose avec le nom du projet dans le fichier yml .

Et pourquoi n'utilisez-vous pas le mĂȘme mĂ©canisme dans tous vos projets si cela vous dĂ©route tellement?

Oui, j'utilise simplement les fonctionnalitĂ©s par dĂ©faut docker-compose ; la plupart du temps, le nom du rĂ©pertoire est correct, mais au cas oĂč je devrais le renommer, mais que je voudrais continuer Ă  travailler avec le mĂȘme ensemble de conteneurs, j'ajoute un fichier .env .

Si vous ajoutez cela, les gens se plaindront d'avoir tué les mauvais conteneurs, car ils font partie de la pile, car ils utilisaient auparavant le nom du répertoire.

Cela n'a pas de sens. Si quelqu'un n'ajoute pas le nom du projet Ă  docker-compose.yml rien ne changera. Et s'ils l'ajoutent, c'est parce qu'ils le veulent lĂ -bas! Personne ne l'ajoutera Ă  moins d'en avoir besoin.

Et mĂȘme s'ils le font, tout va bien. Je ne comprends pas quel problĂšme vous essayez de construire ici. Vous compliquez trop les choses.

Si vous mĂ©langez toutes les options oĂč un nom de projet pourrait ĂȘtre configurĂ©, je dirais que c'est votre problĂšme. Vous ne devriez pas du tout faire ça.

3 des 4 options de l'arborescence des priorités sont sans valeur une fois que vous avez plusieurs fichiers de composition nommés dans un répertoire. Ne me dites pas de créer des sous-répertoires, car je partage toujours un fichier .env entre eux.

Ne me dites pas de créer des sous-répertoires, car je partage toujours un fichier .env entre eux.

Partagez-vous un fichier .env spécifique env_file ?
Ou celui que docker-compose utilise?
Ou les mélangez-vous?

Cela n'a pas de sens. Si quelqu'un n'ajoute pas le nom du projet Ă  docker-compose.yml, rien ne changera.

Ce n'est pas le problÚme, mais quand il serait ajouté, le comportement change radicalement.

Lorsque nous copions une pile dans un nouveau répertoire pour générer une instance temporaire (c'est-à-dire pour tester une mise à jour), nous n'avons pas du tout à toucher docker-compose.yml . Mais si cela fait partie de la pile, nous devrons décider si nous le remplaçons par .env ou si nous le changeons en docker-compose.yml .

Oui, il se peut que cela n'aurait pas dĂ» ĂȘtre ajoutĂ© en premier lieu, mais avoir une autre option ici ne rend pas les choses plus faciles et plus concises.

J'ai un fichier .env unique commun que 4 fichiers de composition nommĂ©s (dans le mĂȘme rĂ©pertoire) utilisent. Aucune variable d'environnement. Pas de scripts shell. J'utilise juste composer.

Je préférerais ça

docker-compose -f service1.yml up -d

Au lieu de cela, c'est plus comme ça

docker-compose -f service1.yml up -d
# F#&$, forgot the -p flag.   Curse the compose devs for 3 years of c#*$blocking
docker-compose -f service1.yml down
docker-compose -f service1.yml -p service1 up -d

@ schmunk42 vous pensez sĂ©rieusement que c'est une solution pour taper 'COMPOSE_PROJECT_NAME = ...' Ă  chaque fois pour chaque commande docker-compose, Ă©ventuellement en plus du nom de fichier compose? Cela vous oblige Ă©galement Ă  connaĂźtre et Ă  retenir le nom du projet. Pouvoir spĂ©cifier le nom du projet dans une variable d'environnement a son utilitĂ© Ă  coup sĂ»r, mais dans certains cas, vous voulez simplement avoir un rĂ©pertoire avec quelques fichiers yml et ĂȘtre en mesure de gĂ©rer facilement les projets de maniĂšre infaillible sans avoir Ă  le faire. souvenez-vous des noms de projet que vous avez choisis il y a des mois et sans avoir Ă  vous souvenir d'exporter les variables d'environnement.

Vous ne pouvez pas utiliser un dossier par service et avoir toujours un fichier .env dans le dossier supérieur?

docker-compose -f service1/docker-compose.yml up -d
docker-compose -f service2/docker-compose.yml up -d

Écrivez simplement le nom du projet dans le fichier (-path) 😉

J'abandonne. Il est évident que la clientÚle pour cela a changé.

Faites-moi savoir ce qui ne va pas avec la proposition que je vous ai faite.

J'avais les mĂȘmes prĂ©occupations au dĂ©but, mais nous avons ajustĂ© nos flux de travail aux fonctionnalitĂ©s disponibles.

Je ne me souviens pas d'avoir tué accidentellement un tapis au cours des 2 derniÚres années, par personne de notre équipe. Nous exécutons plus de 200 piles avec environ 1000 conteneurs et 1000 redéploiements automatiques ou manuels de cette façon.

Je ne veux pas vraiment m'impliquer ici ... mais je ne peux pas résister.

Il y a une diffĂ©rence trĂšs importante entre une «solution» Ă©tant donnĂ© la situation actuelle, et la «bonne» solution Ă©tant donnĂ© les possibilitĂ©s qui existent. Ce sur quoi cette question devrait se concentrer, c'est de trouver la «bonne» solution, ce qui en ce qui me concerne est assez Ă©vident, bien que certains puissent encore ĂȘtre en dĂ©saccord.

@ schmunk42 et @mikehaertl

Je ne me souviens pas d'avoir tué accidentellement un tapis au cours des 2 derniÚres années, par personne de notre équipe .

Je dois demander. Je vois que vous faites tous les deux partie de l'organisation codemix . Êtes-vous des collĂšgues? Commencer Ă  se demander si dans les coulisses vous ĂȘtes tous les deux rotfl.

Actuellement, c'est (trié par priorité):

  1. la valeur de -p
  2. la valeur de COMPOSE_PROJECT_NAME de votre environnement
  3. la valeur de COMPOSE_PROJECT_NAME de votre fichier .env
  4. le nom du répertoire courant

Pour ĂȘtre l'avocat du diable, pourquoi ajouter un 5Ăšme Ă  cette configuration dĂ©jĂ  dĂ©routante?

Le problÚme, tel que je le vois, est que chaque valeur unique actuellement disponible est spécifique à l'environnement. Il n'y a aucun moyen de fournir une option spécifique au projet.

1 + 2. Doit ĂȘtre fourni manuellement par l'utilisateur qui appelle la commande.

  1. _Pourrait_ ĂȘtre partagĂ©, mais en pratique .env devrait ĂȘtre ignorĂ© et non partagĂ© pour une bonne raison. (Je contourne ce problĂšme en partageant .env.example , mais cela nĂ©cessite toujours une Ă©tape manuelle supplĂ©mentaire.)
  2. Est effectivement alĂ©atoire et est spĂ©cifique Ă  l'utilisateur / Ă  l'environnement. (Je considĂšre Ă©galement cela comme une solution de secours, car composer _nĂ©cessite_ un nom de projet. Ce n'est mĂȘme pas une trĂšs bonne solution de secours, car il pourrait y avoir des projets dans diffĂ©rents rĂ©pertoires nommĂ©s de la mĂȘme maniĂšre qui seraient en conflit.)

À mon avis, et pour beaucoup de ceux de ce fil, il devrait y avoir une option qui vit entre 3 et 4, oĂč un nom de projet par dĂ©faut _peut_ ĂȘtre fourni dans n'importe quel fichier docker-compose utilisĂ© pour ce projet et utilisĂ© comme premier se retirer. Cette valeur serait ensuite partagĂ©e par toute personne dĂ©ployant ce projet. Les options 1 Ă  3 remplaceraient cette valeur et l'option 4 ne serait utilisĂ©e que si elle n'Ă©tait pas fournie.

@benjaminwood Je peux vous assurer que personne ne rit de ce problÚme. Oui, nous nous connaissons depuis un certain temps et ce n'est pas la premiÚre fois que nous sommes fondamentalement en désaccord. Cela peut sembler ennuyeux pour plusieurs utilisateurs ici, mais ce n'est pas mon intention. En fait, j'aimerais partager mes expériences et proposer des solutions. Je crois avoir une vaste expérience sur ce sujet. Si la fonctionnalité était introduite comme proposé, cela introduirait une énorme source d'erreurs possibles dans notre configuration.

@joshuajabbour

  1. Peut ĂȘtre partagĂ©, mais dans la pratique, .env doit ĂȘtre ignorĂ© et non partagĂ© pour une bonne raison.

Cela dépend de votre configuration, nous l'avons ignoré dans tous nos référentiels de projet.
Mais nous ne l'ignorons pas dans nos référentiels de staging et de production uniquement. Si vous partagez le nom commis dans docker-compose.yml vous pouvez également commettre .env (ce fichier est uniquement pour la commande docker-compose - rien d'autre)

  1. Est effectivement aléatoire et est spécifique à l'utilisateur / à l'environnement.

Ce n'est pas plus ou moins aléatoire qu'une valeur dans docker-compose.yml , vous devez afficher la configuration de la pile comme un dossier, pas un seul fichier. Si vous faites cela, vous pouvez avoir le nom en .env ou un nom de sous-dossier.


J'ai une derniĂšre alternative pour vous tous:

docker stack deploy -c docker-compose.yml the-project-name

(*) Uniquement disponible en mode essaim

Je ne vois pas comment un nom de projet pourrait ĂȘtre placĂ© dans le fichier yml Ă  l'avenir, cela contredirait totalement l'idĂ©e d'une dĂ©finition de pile.

Merci @ schmunk42. Je crois que vous et je pense que vous avez trÚs bien géré les choses parmi toutes les opinions fortes affichées dans ce fil.

cela introduirait une Ă©norme source d'erreurs possibles dans notre configuration.

VoilĂ  le hic. Fermez le problĂšme.

Cela dépend de votre configuration, nous l'avons ignoré dans tous nos référentiels de projet. Mais nous ne l'ignorons pas dans nos référentiels de staging et de production uniquement.

Donc, cette fonctionnalitĂ© que tout le monde veut ne devrait pas ĂȘtre introduite car elle briserait votre architecture de rĂ©fĂ©rentiel inhabituelle?

Si vous souhaitez partager le nom engagé dans docker-compose.yml vous pouvez également valider .env (ce fichier est uniquement pour la commande docker-compose - rien d'autre).

Eh bien, si la seule chose dans mon fichier .env était COMPOSE_PROJECT_NAME , alors oui. Mais il est rempli de nombreuses autres variables _secure_ que je ne veux pas commettre. Et je les importe dans docker-compose en utilisant la propriété environment . C'est à cela que servent généralement les fichiers .env ...

Je ne comprends toujours vraiment pas comment cela casserait votre configuration, car dans ma proposition, cela ne remplace que le nom du projet par dĂ©faut extrait du rĂ©pertoire. Et si vous en dĂ©pendez (parce qu'il s'agit d'un rĂ©pertoire engagĂ© _ dans votre dĂ©pĂŽt par opposition au rĂ©pertoire dans lequel votre dĂ©pĂŽt est clonĂ©), comment pourrait-il ĂȘtre remplacĂ© par le paramĂštre docker-compose.yml (car il est Ă©galement validĂ© Ă  votre repo; vous contrĂŽlez les deux choses dans votre scĂ©nario)?

@ schmunk42 Ce que vous dites, c'est "Je ne veux pas de nouvelles fonctionnalités, sinon je ne comprends plus la configuration de mon projet".

SĂ©rieusement? C'est votre argument pourquoi vous voulez que tous les autres qui en ont besoin s'en passent?

Juste pour information: je suis ici aussi. N'hésitez pas à clÎturer le problÚme. La discussion ici est devenue inutile.

Donc, cette fonctionnalitĂ© que tout le monde veut ne devrait pas ĂȘtre introduite car elle briserait votre architecture de rĂ©fĂ©rentiel inhabituelle?

J'exprime mes inquiétudes quant au fait que cela pourrait introduire des sources supplémentaires d'erreurs.

Eh bien, si la seule chose dans mon fichier .env était COMPOSE_PROJECT_NAME, alors oui. Mais il est rempli de nombreuses autres variables sécurisées que je ne veux pas voir validées. Et je les importe dans docker-compose en utilisant la propriété environment.

Utilisez un secrets.env pour ceux-ci et importez-le via env_file .
Comment cela affecterait-il votre flux de travail?

C'est à cela que servent généralement les fichiers .env ...

C'est vrai ... mais je pense toujours que le problÚme est que docker-compose détourne le fichier .env .

Comment serait-ce, si vous pouviez définir ces variables plus celles utilisées dans les niveaux supérieurs de docker-compose.yml , comme IMAGE_VERSION , dans un fichier appelé docker-compose.env ?

Je n'ai jamais osé proposer COMPOSE_COMMAND_ENV_FILENAME=.env - jusqu'à présent :)

Je ne comprends toujours vraiment pas comment cela briserait votre configuration, ...

Il est vrai que cela ne casse pas immédiatement, mais il ne s'agit que de mon premier point - et d'introduire encore plus d'options.

Pensez à utiliser plusieurs fichiers -f docker-compose.A.yml -f docker-compose.B.yml , disons que A est votre projet et s'appuie sur le nom du projet par répertoire (nous le faisons, puisque nous le contrÎlons!), Tandis que B est un ensemble de services supplémentaires avec project_name: extra , introduits accidentellement lors du test dans un dossier contenant .env fichier COMPOSE_PROJECT_NAME=testing .

Mais maintenant, tout projet, qui est dĂ©marrĂ© sans fichier .env , serait nommĂ© extra . đŸ’„

Nous fusionnons des fichiers sur plusieurs niveaux, y compris plusieurs fichiers *.env , c'est un cas d'utilisation trĂšs valide.

SĂ©rieusement? C'est votre argument pourquoi vous voulez que tous les autres qui en ont besoin s'en passent?

Attention: légÚrement hors sujet, mais toujours lié au docker ...

@mikehaertl Je me demande vraiment que vous le voyez de cette façon;)

Salut les gens,

Nous avons repris la discussion passionnĂ©e dans ce fil (merci Ă  ceux d'entre vous qui l'ont gardĂ© courtois et cordial!) Et mĂȘme si nous croyons toujours fondamentalement que le nom du projet n'appartient pas Ă  un fichier Compose, nous avons trouvĂ© ce que nous pensons ĂȘtre un juste milieu avec le PR suivant: # 5378. Cela dit, nous apprĂ©cierions vos commentaires Ă  ce sujet pour nous assurer qu'il rĂ©pond Ă  vos besoins.

Voici l'essentiel:

  • Vous pouvez ajouter une entrĂ©e x-project-name dans votre fichier Compose. Cette clĂ© est ignorĂ©e par dĂ©faut.
  • Lorsque COMPOSE_X_PROJECT_NAME est dĂ©fini dans votre environnement (ou .env fichier), Compose tentera de rĂ©cupĂ©rer le nom du projet Ă  partir de l'entrĂ©e x-project-name dans votre fichier Compose.
  • Cette option a une prioritĂ© infĂ©rieure Ă  COMPOSE_PROJECT_NAME et --project-name

Heureux de répondre à toutes vos questions ou préoccupations à ce sujet.

@ shin- Donc COMPOSE_X_PROJECT_NAME devrait ĂȘtre rĂ©glĂ© sur 1 pour activer la fonctionnalitĂ©?

Si tel est le cas, COMPOSE_ENABLE_X_PROJECT_NAME pourrait aussi ĂȘtre un nom Ă  prendre en compte, mais ce ne sont que mes 2 cents - je ne l'utiliserai pas de toute façon 😄

@ schmunk42 Toute valeur "vérité-y" fonctionnera , mais oui, c'est l'idée.

@matsaman Cool, merci pour les commentaires utiles et exploitables.

Au lieu de nous dire que nous devrons dire aux utilisateurs finaux de définir une variable ou d'appeler un paramÚtre, vous nous dites que nous devrons dire aux utilisateurs finaux de définir une variable ou d'appeler un paramÚtre.

HonnĂȘtement, et vraiment pas pour rien, je ne peux pas imaginer comment vous avez considĂ©rĂ© cela comme une solution de quelque maniĂšre que ce soit.

@ shin- Je vais vous expliquer en quoi ce changement ne fait aucune différence utile:

Le fait de devoir dĂ©finir une variable d'environnement pour permettre la recherche du nom du projet dans le fichier de composition Ă©quivaut Ă  peu prĂšs {quantitĂ© de travail, risque d'oubli et commoditĂ©} Ă  dĂ©finir une variable d'environnement pour le nom du projet lui-mĂȘme.

Tout l'intĂ©rĂȘt de dĂ©finir le nom du projet dans le fichier de composition est d'Ă©viter d'avoir Ă  utiliser des variables d'environnement. Vous pouvez utiliser la prioritĂ© sur la variable d'environnement de nom de projet pour donner aux utilisateurs la possibilitĂ© de remplacer le nom de projet dans le fichier de composition.

Je pense que c'est une trÚs bonne solution, car cela ne cassera pas BC et cela évitera d'introduire des erreurs lors de la fusion comme je l'ai décrit ci-dessus.

Le fait de devoir dĂ©finir une variable d'environnement pour permettre la recherche du nom du projet dans le fichier de composition Ă©quivaut Ă  peu prĂšs {quantitĂ© de travail, risque d'oubli et commoditĂ©} Ă  dĂ©finir une variable d'environnement pour le nom du projet lui-mĂȘme.

Ce n'est pas le cas, vous pouvez effectuer ce paramĂštre une fois, globalement dans votre environnement - vous n'avez pas besoin de le faire dans chaque projet.

Ce n'est pas le cas, vous pouvez effectuer ce paramĂštre une fois, globalement dans votre environnement - vous n'avez pas besoin de le faire dans chaque projet.

Je suppose que vous voulez dire globalement dans toutes vos coquilles que vous créez sur votre ordinateur. Si vous faites cela, vous pourriez avoir un comportement indésirable dans des projets totalement indépendants. Cela entraßnera également de la confusion lorsqu'un développeur extrait un projet du contrÎle de version et oublie de définir la variable d'environnement.

L'un des objectifs les plus importants d'avoir le nom du projet dans le fichier de composition est de garantir que chaque variable liée au projet de composition est stockée dans le contrÎle de version.

@nhooey @matsaman
Il est spĂ©cifiquement destinĂ© Ă  aider les personnes qui ont plusieurs fichiers de composition dans le mĂȘme rĂ©pertoire, pour qui la solution de fichier .env n'est pas une option. Si cela doit toujours ĂȘtre activĂ© pour vos projets, il est facile de le dĂ©finir dans votre fichier .env , votre .profile , ou partout ailleurs qui garantira que x-project-name sera toujours pris en compte.

Au lieu de nous dire que nous devrons dire aux utilisateurs finaux de définir une variable ou d'appeler un paramÚtre, vous nous dites que nous devrons dire aux utilisateurs finaux de définir une variable ou d'appeler un paramÚtre.

Notre principale prĂ©occupation Ă  ce sujet a toujours Ă©tĂ© que «l'utilisateur final» ait ses propres projets et qu'il veuille Ă©viter Ă  tout prix les conflits de noms. À cet Ă©gard, ils devraient contrĂŽler le nom du projet et non le distributeur. Si vous expĂ©diez des projets «clĂ© en main» aux clients, il est tout aussi trivial de dĂ©finir COMPOSE_X_PROJECT_NAME dans le fichier associĂ© .env - donc je ne sais pas quelle partie de ceci est une prĂ©occupation pour ĂȘtre honnĂȘte.

Si vous faites cela, vous pourriez avoir un comportement indésirable dans des projets totalement indépendants.

Pouvez-vous donner un exemple? Je ne peux penser à aucun comportement indésirable simplement en définissant COMPOSE_X_PROJECT_NAME dans mon shell.

L'un des objectifs les plus importants d'avoir le nom du projet dans le fichier de composition est de garantir que chaque variable liée au projet de composition est stockée dans le contrÎle de version.

Pourquoi ne pouvez-vous pas utiliser .env pour cela? Personne n'interdit de stocker .env dans le contrĂŽle de version (oui, ce n'est pas courant).

Nous avions .env au départ. Vous avez clairement manqué toute la conversation.

@matsaman Vous devez sĂ©rieusement attĂ©nuer votre attitude. Vous avez Ă©tĂ© mĂ©chant depuis que vous avez commencĂ© Ă  commenter dans ce fil et cela n'a fait qu'empirer la conversation en consĂ©quence. Si vous ne pouvez pas ĂȘtre courtois lorsque vous partagez vos pensĂ©es, nous pouvons nous passer de votre opinion.

Pour clarifier une partie de la confusion

Tu peux déjà faire ça

Auparavant, vous pouviez définir un nom de projet à l'aide d'une variable d'environnement. La nouvelle variable d'environnement n'est pas un nom, c'est une bascule qui a activé une fonctionnalité qui vous permet de définir un nom de projet dans le fichier de composition.

Je suppose que vous voulez dire globalement dans toutes vos coquilles que vous créez sur votre ordinateur. Si vous faites cela, vous pourriez avoir un comportement indésirable dans des projets totalement indépendants.

Si vous voulez dire "d'autres projets" comme-in, "quelque chose qui n'est pas composé pourrait lire ceci et casser" Je pense que ce n'est pas réaliste. Il y a beaucoup de variables d'environnement définies dans chaque shell. La variable d'environnement est correctement nommée "COMPOSE_X_".

Si vous voulez dire "d'autres projets de composition", alors je pense que vous faites en fait un argument pour expliquer pourquoi cette variable est nécessaire. Si la fonctionnalité était activée par défaut, toute personne se basant sur le comportement par défaut actuel serait interrompue.

Si ce n'est ni l'un ni l'autre, veuillez clarifier.

Cela entraßnera également de la confusion lorsqu'un développeur extrait un projet du contrÎle de version et oublie de définir la variable d'environnement.

Si un projet ne fonctionne qu'avec un nom de projet spĂ©cifique, je pense qu'il y a d'autres problĂšmes. Il ne devrait jamais y avoir de cas oĂč un projet ne fonctionne qu'avec un seul nom.

Je vois cela comme un autre argument pour ne pas mettre le nom du projet dans le fichier Compose. Si le nom du projet se trouve dans le fichier de composition, deux projets peuvent utiliser le mĂȘme nom, provoquant un conflit qui interromprait les deux projets. Le nom doit vraiment ĂȘtre dĂ©fini par le dĂ©veloppeur qui sait quels autres noms de projet sont dĂ©jĂ  utilisĂ©s.

Malheureusement, cela ne m'aidera pas non plus pour les raisons que j'ai déjà mentionnées il y a plus d'un an.

Une solution qui implique des variables environnementales exigerait des utilisateurs qui doivent savoir comment les créer en premier lieu. Je sais que cela peut sembler difficile à croire, mais tout le monde ne travaille pas à l'intérieur du terminal. Encore une fois, mettre un .env dans le référentiel n'est pas une option pour moi.

La beauté de docker-compose est up . Pas d'instructions sur la façon de configurer cet appel.

@fiveanddone

Encore une fois, mettre un .env dans le référentiel n'est pas une option pour moi.

Pouvez-vous développer? Je vous entends totalement sur les utilisateurs ayant des connaissances techniques inférieures, mais s'ils ne sont pas censés interagir avec le code ou l'environnement, pourquoi est-ce un problÚme d'inclure un fichier .env avec le projet?

@ shin- Ouais, pas de problĂšme.

J'ai dans certains cas inclus ce fichier dans le rĂ©fĂ©rentiel mais cela ne fonctionne pas tout le temps. Mes cas d'utilisation concernent principalement le dĂ©veloppement Web oĂč les connaissances techniques des dĂ©veloppeurs peuvent varier considĂ©rablement.

Le .env contient des paramÚtres qui sont utilisés dans d'autres frameworks. Certaines des variables à l'intérieur de mon .env sont des informations d'identification pour des services externes comme SMTP. La plupart des développeurs de mon équipe pointent ces services vers leurs propres points de terminaison en utilisant leur propre fichier .env . Si le .env n'est pas là, j'ai des valeurs par défaut.

Pour les dĂ©veloppeurs moins techniques qui veulent peut-ĂȘtre simplement changer du CSS, l'application fonctionne bien sans le fichier .env . Cela suppose qu'ils ne nomment pas tous les dossiers de projet de la mĂȘme maniĂšre. :)

Cela peut ne pas sembler beaucoup, mais lorsque vous travaillez avec plusieurs développeurs et concepteurs qui couvrent le pays, le plus simple sera le mieux.

Docker m'a tellement simplifié la vie et je suis trÚs reconnaissant pour ce projet, mais je peux comprendre les frustrations autour de ce fil.

@fiveanddone Merci pour la perspicacité! Donc, si le fichier .env était appelé docker-compose.env (ou similaire) à la place, est-ce que cela atténuerait vos inquiétudes?

@tibia-

Oui, ce serait pour mes cas d'utilisation.

Le fichier env est-il chargé automatiquement par Docker Compose?

Sinon, docker-compose.env pourrait-il ĂȘtre chargĂ© automatiquement?

@nhooey Le fichier env est chargé automatiquement s'il est nommé .env . Et vous pouvez également spécifier le fichier env pour chaque service individuellement. Voir la documentation .

Le fichier env est chargé automatiquement s'il est nommé .env. Et vous pouvez également spécifier le fichier env pour chaque service individuellement. Voir la documentation.

Ne pas ĂȘtre le pinailleur ici, mais ce n'est pas vraiment correct. Et Ă  mon humble avis, la plus grande source de malentendu sur l'ensemble du sujet.

Aucune des variables de .env n'est transmise à un conteneur / service, si vous ne le transférez pas explicitement , en utilisant soit

env_file: 
  - .env

ou

environment:
  - VAR_FROM_DOTENV
  - FOO=${ANOTHER_VAR_FROM_DOTENV}

Le fichier .env est chargé automatiquement, oui, mais sans configuration supplémentaire, il ne s'applique qu'à ces variables d'environnement de la CLI Compose .

Je soutiendrais fortement de renommer cela en docker-compose.env par dĂ©faut et encore mieux - une variable pour cela , donc cela pourrait ĂȘtre utilisĂ© de maniĂšre BC en dĂ©finissant juste un ENV-var.

(merci à ceux d'entre vous qui l'ont gardé civil et cordial!)

Je vous entends et je suis sûrement coupable de ne pas toujours garder mon sang-froid. Désolé. Certains commentaires me permettent parfois de vraiment démarrer ... travailleront là-dessus.

Si le nom du projet se trouve dans le fichier de composition, deux projets peuvent utiliser le mĂȘme nom, provoquant un conflit qui interromprait les deux projets.

Notre principale prĂ©occupation Ă  ce sujet a toujours Ă©tĂ© que «l'utilisateur final» ait ses propres projets et qu'il veuille Ă©viter Ă  tout prix les conflits de noms. À cet Ă©gard, ils devraient contrĂŽler le nom du projet et non le distributeur.

@ shin- Cela semble comme il est communément admis que docker-compose.yml fait toujours partie d'un projet et vit dans le référentiel du projet. Je dirais que ce n'est pas forcément vrai. Certains d'entre nous ne partagent docker-compose.yml mais souhaitent conserver leur version locale avec des personnalisations locales (par exemple, les paramÚtres de développement, les essais, etc.).

Et concernant "Ă©viter les conflits de nom": au lieu d'un conflit de nom avec le nom du projet, nous avons maintenant un conflit de nom beaucoup plus critique (IMO) au niveau du systĂšme de fichiers: .env est un nom commun que les projets utilisent pour dĂ©finir leur paramĂštres spĂ©cifiques Ă  l'application. Il ne devrait pas ĂȘtre polluĂ© avec les paramĂštres du docker Ă  moins qu'un dĂ©veloppeur ne veuille vraiment le faire. Mais cette dĂ©cision devrait ĂȘtre laissĂ©e au dĂ©veloppeur.

Voici une suggestion: que diriez-vous d'ajouter deux autres options pour le nom du projet et de déconseiller l'utilisation de .env dans la V4 de docker-compose.yml ? L'un est project_name in docker-compose.yml , l'autre est un fichier .dockerproject qui ne contient que le nom et ne doit

Voici ma suggestion de priorité (la plus élevée en premier):

  • -p Argument CLI
  • .dockerproject fichier
  • project_name in docker-compose.yml (Ă  Ă©viter si docker-compose.yml est distribuĂ© avec le projet)
  • COMPOSE_PROJECT_NAME de l'environnement
  • COMPOSE_PROJECT_NAME from .env (obsolĂšte)
  • nom du rĂ©pertoire

De cette façon, les utilisateurs finaux peuvent toujours remplacer un nom de projet dans .dockerproject mĂȘme si quelqu'un l'a codĂ© en dur dans un docker-compose.yml distribuĂ©.

MISE À JOUR: Je pourrais aussi vivre avec l'utilisation de .dockerenv ou docker.env au lieu de .dockerproject . Mais il devrait avoir une prioritĂ© plus Ă©levĂ©e pour rĂ©soudre le problĂšme, que certains ici doivent remplacer les noms de projet codĂ©s en dur dans docker-compose.yml .

Salut Ă  tous,

Tout d'abord, merci @dnephin et @ shin- pour avoir examinĂ© ce cas. Le changement que @ shin- a soumis semble ĂȘtre un grand pas en avant pour rĂ©soudre ce problĂšme.

J'ai validé le PR 5378 sur le projet de test pour le cas d'utilisation suivant: A default project name defined by the project, that can be checked in (https://github.com/docker/compose/issues/745#issuecomment-282858900). Pour cela j'ai fait un repo git illustrant différentes possibilités: https://github.com/estarter/compose_745

J'ai trouvé PR # 5378 couvrant partiellement le cas d'utilisation. Le problÚme est que la solution nécessite la variable COMPOSE_X_PROJECT_NAME env. Solutions possibles:

  1. conserver la variable env dans le dossier du projet. J'ai essayé le fichier .env mais cela ne fonctionne pas lorsque docker-compose est appelé depuis un autre emplacement (voir l' exemple de commandes , composer des fichiers )
  2. dĂ©finir COMPOSE_X_PROJECT_NAME globalement (.profile ou Ă©quivalent). Cela fonctionnerait mais cela ne peut pas ĂȘtre spĂ©cifiĂ© dans le projet, c'est Ă  dire que ce n'est pas une solution pour notre cas d'utilisation defined by the project, that can be checked in
  3. y a-t-il une autre option?

J'espÚre que j'ai réussi à illustrer le cas d'utilisation qui est abordé ici.

Chers responsables, veuillez considérer comment le cas d'utilisation est résolu par PR # 5369 qui introduit la propriété optionnelle project_name dans le fichier docker-compose. Cette propriété est de faible priorité mais ne dépend pas de l'environnement ou du répertoire de travail.

  1. y a-t-il une autre option?

Il existe cette option docker-compose --project-directory <PATH> (Spécifiez un autre répertoire de travail). Devrait également fonctionner avec un fichier .env .

Pour ajouter un autre cas d'utilisation nuancé au mix:
Dans mon cas d'utilisation, j'ai deux référentiels, un pour le projet principal (utilisé pour construire / déployer) et un pour devops (contenant le Dockerfile, docker-compose.yml, etc.)
Dans notre configuration actuelle, le dépÎt principal du projet est à la racine ./ et le dépÎt devops est extrait dans un sous-répertoire ./devops/

Dans cette configuration, l'utilisation d'un fichier .env ne fonctionne pas car il doit ĂȘtre:

placĂ© dans le dossier oĂč la commande docker-compose est exĂ©cutĂ©e (rĂ©pertoire de travail courant).
(réf doc)

Ce qui ne fonctionne pas, car il est appelé comme: docker-compose -f devops/docker-compose.yml
Bien sûr, nous pouvons ajouter le paramÚtre -p ici, qui est ce que nous utilisons actuellement, mais il est sujet à l'erreur humaine comme cela a été mentionné ci-dessus.

Si le fichier .env (ou proposĂ© docker-compose.env) pouvait ĂȘtre lu Ă  partir du mĂȘme rĂ©pertoire oĂč rĂ©side le docker-compose.yml, alors dĂ©finir le nom du projet lĂ -bas fonctionnerait pour moi.

L'utilisation de la directive env_file dans le fichier docker-compose.yml ne fonctionne pas, car ces variables d'environnement ne sont appliquées qu'à l'intérieur du conteneur, pas à la création des conteneurs.

En fin de compte, mon objectif est de garder mes fichiers liĂ©s aux devops autonomes d'une maniĂšre qui ne pollue pas la base de code de mon projet, mais qui peut toujours ĂȘtre accĂ©dĂ©e / exĂ©cutĂ©e en parallĂšle avec ce dĂ©pĂŽt.

Il y a cette option docker-compose --project-directory(Spécifiez un autre répertoire de travail). Devrait également fonctionner avec un fichier .env.

@ schmunk42 pourrait ĂȘtre une bonne --project-directory ne fonctionne pas pour le fichier .env. J'ai essayĂ© comme suit, le fichier .env a Ă©tĂ© ignorĂ© ( fichiers de projet ):

docker-compose -f PR_5378/docker-compose.yml -f PR_5378/docker-compose2.yml --project-directory PR_5378 down

À l'avenir, je supprimerai les commentaires qui ne contribuent pas Ă  la conversation de maniĂšre constructive. Je n'ai aucun intĂ©rĂȘt Ă  interagir avec les enfants.

En ayant un nom .env réglable
Le problÚme avec une variable d'environnement désignant le fichier .env à utiliser est qu'il s'agit essentiellement d'une dépendance circulaire. Nous devrions introduire une exception dans la maniÚre dont les variables d'environnement sont interprétées, ce qui, bien que raisonnable, est intrinsÚquement contre-intuitif.

Sur le nom .env lui-mĂȘme
Il est maintenant Ă©vident que le nom .env est utilisĂ© par une multitude de logiciels et de frameworks, et n'est gĂ©nĂ©ralement pas destinĂ© Ă  ĂȘtre validĂ© dans le contrĂŽle de version. Nous sommes trĂšs sensibles aux changements de rupture, mais nous pourrions introduire un nom alternatif (par exemple docker-compose.env ) avec un retour au fichier .env si l'ancien n'existe pas, avec l'intention que il peut ĂȘtre partagĂ© avec d'autres utilisateurs.

Lors de l'ajout de project_name au fichier de composition
Nous avons déjà réitéré notre position à ce sujet à plusieurs reprises - voir le dernier commentaire de Daniel pour certaines des raisons pour lesquelles nous nous opposons à ce changement. Ce n'est pas que ce soit difficile. Ce n'est pas que nous n'y avons pas pensé. Nous avons passé beaucoup de temps à l'évaluer, et nous pensons que la qualité du projet en souffrirait trop pour justifier son ajout (sous cette forme). De maniÚre réaliste, # 5378 est probablement la meilleure concession que nous puissions faire pour que cela fonctionne d'une maniÚre opt-in et rétrocompatible (EDIT: Bien sûr, je suis ouvert aux suggestions qui améliorent cette proposition dans ces paramÚtres)

Sur --project-directory
Un peu tangente, mais je sais que cette option est un peu cassée en ce moment. Rétrospectivement, j'aurais préféré ne pas l'ajouter du tout, car cela crée plus de problÚmes qu'il n'en résout. Je vais essayer de passer un peu de temps pour voir si c'est réparable, mais il y a beaucoup de cas de bord étranges qui le rendent vraiment peu fiable.


Cela dit, y a-t-il quelqu'un pour qui docker-compose.env + # 5378 ne serait pas une solution satisfaisante? Je comprends que ce n'est peut-ĂȘtre pas votre solution prĂ©fĂ©rĂ©e, mais je vous demande si vous faites des concessions raisonnables auxquelles vous pouvez faire face.

Blague Ă  part ...

Je ne comprends toujours pas comment le dernier commentaire de Daniel se rapporte Ă  la "qualitĂ© du projet". De plus, c'est une rĂšgle gĂ©nĂ©rale selon laquelle l'ajout d'une clĂ© Ă  un dictionnaire ne devrait jamais entraĂźner de rupture de compatibilitĂ© descendante. Il y a toujours des cas oĂč les programmeurs ont mis en Ɠuvre des choses d'une maniĂšre que ce n'est pas le cas, mais je m'Ă©loigne du sujet.

Je pense que le camp qui veut le champ project-name (ou autre) est justifiĂ©, car le "nom" du projet est fondamental pour de nombreux aspects de l'outillage. Les personnes de ce camp voudront peut-ĂȘtre simplement Ă©crire ce nom quelque part dans la pierre pour Ă©viter les problĂšmes avec des solutions plus temporaires telles que des variables d'environnement ou des commandes telles que des indicateurs.

J'espÚre que cela a été constructif.

@estarter Je considĂ©rerais cela comme un bogue, cela vaut peut-ĂȘtre la peine d'ouvrir un problĂšme sĂ©parĂ© pour cela

En fait, je m'attendrais à ce que cela fonctionne avec le fichier .env dans le répertoire PR_5378 :

docker-compose --project-directory PR_5378 -f docker-compose.yml -f docker-compose2.yml down

Lors de l'ajout de nom_projet au fichier de composition

@ shin- Il semble que la décision soit déjà prise. Mais j'essaie toujours de comprendre le contexte. J'ai déjà posé cette question et je n'ai jamais obtenu de réponse (ce qui est l'une des raisons pour lesquelles la discussion m'a semblé si ennuyeuse).

Pourriez-vous s'il vous plaĂźt m'aider Ă  comprendre, pourquoi nous avons container_name et mĂȘme network dans docker-compose.yml ? Le premier pourrait Ă©galement ĂȘtre source de conflits potentiels. Et ce dernier est trĂšs spĂ©cifique Ă  l'hĂŽte. Selon votre logique, ces deux (et d'autres) ne devraient pas ĂȘtre lĂ  non plus. Je ne vois pas la diffĂ©rence avec project_name .

S'il vous plaĂźt, n'ignorez plus cette question.

@ michael-k Dites-vous que project_name est identique Ă  container_name ? Si vous le dites, je voudrais vous informer qu’un projet peut ĂȘtre constituĂ© de plusieurs conteneurs. Ou vous ai-je mal compris?

Alors que pour network , ce n'est pas nĂ©cessairement spĂ©cifique Ă  l'hĂŽte. Il existe de nombreux cas oĂč un projet nĂ©cessite un rĂ©seau central isolĂ© dans lequel un conteneur interagit avec un autre rĂ©seau. Et ses configurations sont stockĂ©es dans le docker-compose.yml .

@AyushyaChitransh Vous avez mal compris. La question est la suivante: pourquoi container_name , network et autres dans docker-compose.yml alors que project_name ne devrait pas ĂȘtre autorisĂ© Ă  y ĂȘtre? Ils partagent tous le mĂȘme potentiel de conflit ou de configuration spĂ©cifique Ă  l'hĂŽte qui ne doit pas ĂȘtre partagĂ©.

@aan et je connais cette opportunitĂ©. De plus, on pourrait dire la mĂȘme chose des noms de conteneurs, mais nous avons la possibilitĂ© de dĂ©finir le nom du conteneur dans le fichier de composition, non?

Oui, mais je ne pense pas que l'ajout soit une bonne idée.

À partir d'une discussion connexe SpĂ©cifiez le nom du rĂ©seau dans le fichier docker-compose .

@estarter Je considĂ©rerais cela comme un bogue, cela vaut peut-ĂȘtre la peine d'ouvrir un problĂšme sĂ©parĂ© pour cela

@ schmunk42 je vois que les responsables en sont conscients - voir On --project-directory dans le commentaire de Joffrey plus # 4709, # 4933 et # 4841

En fait, je m'attendrais à ce que cela fonctionne avec le fichier .env dans le répertoire PR_5378:
docker-compose --project-directory PR_5378 -f docker-compose.yml -f docker-compose2.yml down

Vous avez supposé que --project-directory affecte le paramÚtre -f .
En fait ce n'est pas le cas, cette commande donne IOError: [Errno 2] No such file or directory: u'./docker-compose.yml'

C'est trÚs bien que --project-directory n'affecte pas -f - sinon imaginez ce que serait un cauchemar d'utiliser --project-directory et plusieurs fichiers docker-compose dans des répertoires différents.

Je suis trÚs surpris de voir autant de délibérations sur quelque chose que je considÚre comme un problÚme résolu.

Voici l'ordre de priorité que j'ai l'habitude de voir:

  1. codé en dur
  2. option cli
  3. environnement
  4. project.rc
  5. défaut sensé

Pour project_name nous n'avons actuellement ni l'option # 1 ni l'option # 4. C'est le problÚme fondamental auquel les gens sont confrontés et il semble facile à résoudre d'une maniÚre rétrocompatible.

Nous semblons avoir des arguments philosophiques sur la puretĂ© qui pourraient ne pas ĂȘtre utiles. L'utilisation d'un schĂ©ma de configuration en cascade OSS trĂšs courant, en revanche, est trĂšs utile.

Nous semblons avoir des arguments philosophiques sur la puretĂ© qui pourraient ne pas ĂȘtre utiles.

Cependant, avoir cet argument n'est vraiment pas le but. DÚs le départ , nous avons été trÚs clairs sur notre position concernant la définition du nom du projet dans le fichier Compose.

Mais laissez-moi ĂȘtre transparent Ă  ce sujet. Cela ne se produira jamais dans docker-compose . Si c'est le seul chemin de rĂ©solution que vous ĂȘtes prĂȘt Ă  accepter pour ce problĂšme, vous devrez alors suivre le processus mĂȘme de l'OSS qui consiste Ă  crĂ©er le projet et Ă  le faire vous-mĂȘme. Le code est disponible et partagĂ© avec une licence trĂšs permissive.

Pourriez-vous s'il vous plaĂźt m'aider Ă  comprendre, pourquoi nous avons container_name et mĂȘme network dans docker-compose.yml? Le premier pourrait Ă©galement ĂȘtre source de conflits potentiels. Et ce dernier est trĂšs spĂ©cifique Ă  l'hĂŽte. Selon votre logique, ces deux (et d'autres) ne devraient pas ĂȘtre lĂ  non plus. Je ne vois pas la diffĂ©rence avec project_name.

Pour container_name , cette option a été introduite trÚs tÎt dans la durée de vie du projet. Comme @ schmunk42 l'a souligné, si nous devions tout recommencer, ce ne serait certainement pas dans les spécifications. Il est constamment mal utilisé et a été la source d'innombrables problÚmes pour les utilisateurs au fil des ans.
Quant à network , je ne suis pas tout à fait sûr de savoir comment cela se compare dans votre esprit?

Qu'en est-il de l'option 4 que j'ai mentionnée? J'ai vu des discussions sur l'introduction d'un .docker-compose pour les paramÚtres spécifiques au répertoire local. Ce serait de loin préférable (imo) à l'introduction des indicateurs d'environnement _x_ (qui nécessitent toujours une gestion d'environnement).

Ce serait comme ça:

# <my-project-dir>/.docker-compose
project_name: foobar

Ce qui précÚde est distinct de l'option de variable d'environnement et est inférieur dans la liste de priorité.

Cela résout bien mon cas d'utilisation et coche un autre chemin de configuration standard de la liste.

@thedeeno Dans notre esprit, COMPOSE_PROJECT_NAME dans le fichier .env accomplit dĂ©jĂ  cela (avec le mĂȘme ordre de prioritĂ© que dans votre plan). Cependant, nous vous avons entendu dire que .env est un mauvais choix de nom, c'est pourquoi nous considĂ©rons docker-compose.env comme alternative. Cela marcherait-il pour toi?

Dans notre esprit, COMPOSE_PROJECT_NAME dans le fichier .env accomplit déjà cela

@ shin- c'est lĂ  que nous ne sommes pas d'accord. Je ne pense pas que ce soit le cas.

Personnellement, j'aime que nous recherchions le fichier .env . C'est un endroit trÚs conventionnel pour mettre des secrets locaux et d'autres configurations spécifiques au matériel local.

Cela fonctionne trÚs bien pour aider avec number 3 ci-dessus, la configuration basée sur l'environnement.

Cela ne nous donne pas de hachures d'Ă©chappement ( number 4 ) lorsque nous ne voulons pas que l'environnement possĂšde le nom du projet.

Dans mon cas, nos développeurs auront chacun leur propre fichier .env (pas VC). Il contient des secrets à injecter dans docker-compose.yaml . Aime ça.

Nous ne voulons cependant pas que les développeurs aient le contrÎle sur le nom du projet, car il est fortement couplé à certains outils. Puisque .env n'est pas dans le contrÎle de version, nous devons demander à nos développeurs de définir manuellement COMPOSE_PROJECT_NAME avec cette approche; et c'est la _une chose_ pas comme les autres, car ce n'est pas un secret.

Malheureusement non, changer simplement le chemin source par défaut du .env ne nous aiderait pas ici. Nous adorons le fait que .env provienne automatiquement. Nous ne voulons tout simplement pas spécifier le nom du projet de cette façon.

Je vais montrer un cas d'utilisation de ma pratique:

J'utilise le fichier .env pour spécifier la version de l'image, et pour éviter une analyse étrange de sed / awk / perl / quelle que soit l'analyse, je remplace simplement la valeur dans CI:

    echo APP_VERSION=$CI_COMMIT_REF_NAME > .env
    docker-compose pull
    docker-compose up -d

plus tard dans docker-compose.yml , l'image est spécifiée comme suit:

    image: my.registry.example.net/app:${APP_VERSION}

maintenant, si j'ai besoin de plus de variables de ce type, je dois faire quelques analyses, sauf si plusieurs fichiers .env sont pris en charge.

alors, peut-ĂȘtre aussi ajouter le support "rĂ©pertoire", comme: docker-compose.env.d/* ou .docker-compose.env.d/* ou docker-compose.d/* .

mais en tant que tel, glob peut créer instantanément des problÚmes de sauvegarde de l'éditeur correspondant ( *~ , *.bak ), il est préférable d'utiliser une extension à la place: docker-compose.env.d/*.sh

... mais lĂ  encore, peut-ĂȘtre simplement le rendre configurable dans docker-compose.yml quels fichiers au niveau racine .env sont chargĂ©s, ou cela introduirait un problĂšme d'oeuf de poule? je ne sais pas comment fonctionne l'analyseur de configuration :)

un peu hors-sujet, mais COMPOSE_PROJECT_NAME env ne permet pas de contrĂŽler entiĂšrement le prĂ©fixe, il serait toujours dĂ©pouillĂ© pour correspondre Ă  A-Za-z0-9_ ... je voulais utiliser - dans mon prĂ©fixe. (Je ne trouve pas oĂč j'ai signalĂ© cela pour le moment, mais afaik ce n'est pas abordĂ©)

il serait logique d'autoriser les mĂȘmes caractĂšres auxquels docker se limite.

@glensc C'est beaucoup d'infrastructure pour gérer l'environnement. Personnellement, je ne pense pas que ce soit la responsabilité de docker-compose .

La seule chose que j'ai vue d'autres projets est de générer automatiquement .env

@glensc @thedeeno Donc, idĂ©alement, nous aurions deux fichiers *.env , l'un destinĂ© Ă  ĂȘtre partagĂ© avec d'autres utilisateurs, et l'autre gardĂ© privĂ©, le dernier remplaçant le premier lorsque les deux dĂ©finissent la mĂȘme variable?

J'ai abordé les noms configurables .env dans mon commentaire la semaine derniÚre.

Avoir un docker-compose.env (tout en étant toujours privé de sourcing automatique .env ) fonctionnerait trÚs bien pour nous!

Nous le traiterions comme un fichier rc et le confierions au contrĂŽle de source.

Je pense qu'avoir des fichiers env publics / privés résout probablement la plupart des cas d'utilisation mentionnés ici. si - était également autorisé dans le nom du projet, ce serait génial.

@thedeeno @glensc Pourriez-vous s'il vous plaĂźt donner un cas d'utilisation oĂč vous avez besoin d' un fichier ENV privĂ© remplaçant les valeurs dans le fichier public?

Les secrets ne doivent pas ĂȘtre dĂ©finis dans docker-compose.env , car ils ne seront pas transmis automatiquement aux conteneurs. Vous pouvez toujours utiliser un fichier .env et en faire ce que vous voulez. Mais il me semble dĂ©routant de mĂ©langer les paramĂštres pour docker-compose et les conteneurs dans la pile.

@ schmunk42 Je n'ai pas ce cas d'utilisation donc je ne serai pas d'une grande aide. J'ai juste besoin de valider le project_name pour le contrÎle de version. docker-compose.env résout cela.

Je ne suis pas sûr de suivre votre deuxiÚme paragraphe. Nous utilisons .env pour les secrets et les injectons manuellement dans docker-compose.yaml .

@ schmunk42 https://github.com/docker/compose/issues/745#issuecomment -346491062

c'est juste parce que le SEUL endroit pour dĂ©finir la ${variables} pour image semble ĂȘtre .env fichier

@glensc D'accord!

Mais à la place, je proposerais docker-compose.override.env pour l'aligner avec la fonctionnalité de remplacement actuelle pour les fichiers yml .

docker-compose.env
docker-compose.override.env
docker-compose.override.yml
docker-compose.yml

Je ne suis pas sûr de suivre votre deuxiÚme paragraphe. Nous utilisons .env pour les secrets et les injectons manuellement dans docker-compose.yaml.

@thedeeno Je suppose que vous faites ceci:

environment:
  - ${SECRET_VAR_FROM_DOTENV}

ce qui devrait Ă©galement ĂȘtre possible avec docker-compose.override.env . Ou vous pouvez faire:

env_file:
  - .env

Suggérez-vous de supprimer .env en faveur d'une composition plus spécifique à docker
chemin?

Si nous sautons le sourcing automatique de .env, cela aura un impact négatif sur mon
flux de travail de l'Ă©quipe. Nous nous appuyons sur ce fichier pour d'autres outils. Nous finirions
mettre nos secrets en deux (.env et cet autre fichier que vous suggérez)
place si docker-compose arrĂȘte de regarder .env.

Le jeu.23 novembre 2017 Ă  01:15 Tobias Munk [email protected]
a Ă©crit:

@glensc https://github.com/glensc D'accord!

Mais Ă  la place, je proposerais docker-compose.override.env pour l'aligner avec
la fonctionnalité de remplacement actuelle pour les fichiers yml.

docker-compose.env
docker-compose.override.env
docker-compose.override.yml
docker-compose.yml

Je ne suis pas sûr de suivre votre deuxiÚme paragraphe. Nous utilisons .env pour les secrets et
injectez-les manuellement dans docker-compose.yaml.

@thedeeno https://github.com/thedeeno Je suppose que vous faites ceci:

environnement:

  • $ {SECRET_VAR_FROM_DOTENV}

ce qui devrait Ă©galement ĂȘtre possible avec docker-compose.override.env. Ou toi
pourrait faire:

env_file:

  • .env

-
Vous recevez cela parce que vous avez été mentionné.
RĂ©pondez directement Ă  cet e-mail, affichez-le sur GitHub
https://github.com/docker/compose/issues/745#issuecomment-346538315 , ou muet
le fil
https://github.com/notifications/unsubscribe-auth/AAFIdxtbI7y3wW2TFa401Go6Msj0gC74ks5s5Q1vgaJpZM4DLBNs
.

Suggérez-vous de supprimer .env en faveur d'une composition plus spécifique à docker
chemin?

Pas nĂ©cessairement, pour BC docker-compose pourrait toujours regarder .env si les autres ne sont pas trouvĂ©s, comme pour fig.yml une fois. Bien qu'il puisse ĂȘtre difficile de dĂ©cider des cas suivants:

.env
docker-compose.env
.env
docker-compose.override.env
.env
docker-compose.env
docker-compose.override.env

.env ne serait pas utilisé dans le dernier cas, mais je ne sais pas comment gérer les deux premiers, car certains utilisateurs utiliseraient .env comme remplacement, d'autres comme solution de secours.

Pour moi .env devrait ĂȘtre utilisĂ© dans tous les cas. C'est un fichier avec une signification particuliĂšre
dans l’écosystĂšme plus large.

Dans votre troisiÚme cas, c'est juste le fichier avec la priorité la plus basse.

Tout ce dont j'ai besoin est un moyen de valider le nom de mon projet dans le contrĂŽle de code source. Je ne
attention particuliÚre à l'environnement en cascade plus sophistiqué
la gestion. Je préférerais en fait que cette stratégie de nom de projet n'ait rien à
faire avec les variables d'environnement.

Si un fichier de configuration est hors de la table et qu'il existe un moyen de valider mon
nom_projet avec cette cascade d'env que vous parlez, je vais l'utiliser avec plaisir
bien que!

Le jeu.23 novembre 2017 Ă  01:31 Tobias Munk [email protected]
a Ă©crit:

Suggérez-vous de supprimer .env en faveur d'une composition plus spécifique à docker
chemin?

Pas nécessairement, pour BC, docker-compose pourrait toujours regarder .env si le
d'autres ne sont pas trouvĂ©s, comme avec fig.yml une fois. Bien que cela puisse ĂȘtre
difficile de décider les cas suivants:

.env
docker-compose.env

.env
docker-compose.override.env

.env
docker-compose.env
docker-compose.override.env

.env ne serait pas utilisé dans le dernier cas, mais je ne sais pas comment gérer
aux deux premiers, puisque certains utilisateurs utiliseraient .env comme remplacement, d'autres comme
se retirer.

-
Vous recevez cela parce que vous avez été mentionné.
RĂ©pondez directement Ă  cet e-mail, affichez-le sur GitHub
https://github.com/docker/compose/issues/745#issuecomment-346539891 , ou muet
le fil
https://github.com/notifications/unsubscribe-auth/AAFId95kZQIsiWp488JyPQOtGJju0OPbks5s5RFbgaJpZM4DLBNs
.

Quant au réseau, je ne suis pas tout à fait sûr de savoir comment il se compare dans votre esprit?

@tibia-

services:
    web:
        build: ./
        networks:
            - my_project_network_on_my_localhost
networks:
    my_project_network_on_my_localhost:
        external: true

Je suppose que je me trompe, car je n'engage jamais mon docker-compose.yml dans mon repo. Il contient toujours des paramÚtres trÚs spécifiques à l'hÎte. Il peut avoir un contenu assez différent lors du développement d'une production.

Je suis fan de "4 project.rc" mĂȘme si j'utiliserais probablement quelque chose comme docker-project.yaml au lieu d'un format diffĂ©rent. C'est exactement ce que dĂ©crit le problĂšme d'origine. En ce qui me concerne, toute discussion sur l'insertion du nom du projet dans le fichier de composition devrait faire l'objet d'un autre numĂ©ro.

Tout ce dont j'ai besoin est un moyen de valider le nom de mon projet dans le contrĂŽle de code source.

C'est encore un point que je ne comprends pas. Il ne devrait y avoir aucune raison d'exiger un seul nom de projet codé en dur. S'il existe un outil externe qui attend un nom cohérent, pourquoi cet outil ne définit-il pas un nom de projet avant d'appeler docker-compose ?

my_project_network_on_my_localhost me semble faux. Pourquoi avez-vous besoin du nom du projet dans un réseau externe? Il n'a pas besoin de correspondre au nom du projet de composition.

my_project_network_on_my_localhost me semble faux.

Ce n'était qu'un exemple. J'ai une configuration de réseau différente sur ma machine de développement locale que sur un serveur de production. De nombreux autres paramÚtres dans mon docker-compose.yml diffÚrent également réguliÚrement de la production, par exemple j'ai des conteneurs utilitaires définis là pour construire des éléments spécifiques au projet ou maintenir une base de données ou autre.

Si j'ai bien compris, l'idée principale derriÚre docker-compose (ou mieux fig ) était de bien organiser toutes ces longues options de ligne de commande docker pour une configuration de conteneur complexe dans un fichier yaml simple. C'est pourquoi cela semble si étrange, qu'il n'y ait qu'une seule option laissée de cÎté. Mais il semble que j'ai manqué d'une maniÚre ou d'une autre que ce n'est plus l'idée principale derriÚre tout cela.

De nombreux autres paramÚtres dans mon docker-compose.yml diffÚrent également réguliÚrement de la production, par exemple, j'ai des conteneurs utilitaires définis pour créer des éléments spécifiques au projet ou maintenir une base de données ou autre.

Nous avons le mĂȘme flux de travail ici. Dans notre cas, la dĂ©finition «commune» de docker-compose ne rĂ©sume presque rien , mais ce sont les seules choses qui sont vraiment partagĂ©es entre le dĂ©veloppement, les tests, la mise en scĂšne et la production.
Les principales parties des paramĂštres de dĂ©veloppement sont dĂ©finies dans un fichier sĂ©parĂ©, la fusion automatique se fait via un fichier .env . C'est la mĂȘme chose pour la configuration de test .

Parce que c'est dans un dossier dans notre cas, nous pouvons faire quelque chose comme

(cd tests && docker-compose up -d)
(cd tests && docker-compose ps)
(cd tests && docker-compose run php codecept run)

pour tester ... ou ceci

(cd production && docker-compose logs -f --tail 100)

pour la production (Bonus: vous pouvez définir DOCKER_HOST en production pour pointer vers une autre machine, mais uniquement avec docker-compose ).

Mais oui, c'est un dossier, pas un fichier - et nécessite cp .env-dist .env dans deux endroits pour travailler, sinon il échoue avec un fichier de composition invalide. En fait, je voulais juste partager ce flux de travail soigné IMHO.

C'est encore un point que je ne comprends pas. Il ne devrait y avoir aucune raison d'exiger un seul nom de projet codé en dur. S'il existe un outil externe qui attend un nom cohérent, pourquoi cet outil ne définit-il pas un nom de projet avant d'appeler docker-compose?

@dnephin Il y a des raisons.

Oui, il y a des solutions de rechange. La demande est de le rendre plus pratique et prévisible.

Voici un exemple oĂč un nom de projet codĂ© en dur aide: la configuration du docker de traefik crĂ©e par dĂ©faut des rĂšgles d'hĂŽte pour les conteneurs au format suivant: <service>.<project>.<domain> . Ce formatage n'est pas facile Ă  modifier. Il est trĂšs avantageux pour nos dĂ©veloppeurs d'utiliser les mĂȘmes fqdns pour nos services docker-compose. Ce serait formidable si nous pouvions utiliser la configuration sans configuration, car elle est la seule façon de garantir la cohĂ©rence est de: a) les forcer Ă  utiliser un nom de rĂ©pertoire spĂ©cifique pour leur clone b) spĂ©cifier manuellement les rĂšgles pour traefik. Les deux sont nulles.

En voici une autre: faire référence à des images créées avec docker-compose. Si nous ne pouvons pas garantir le nom du projet, nous ne pouvons pas garantir ces noms d'image et ne pouvons pas les référencer avec confiance. Bien sûr, nous pouvons coder en dur le image_name pour chaque définition, mais cela semble franchement redondant parce que nous _voulons utiliser la convention_, mais nous craignons simplement que les développeurs qui choisissent d'utiliser des noms de fichiers différents aient des échecs trÚs surprenants dans nos outils.

Les gars, tant de discussions ... quel est le statut de cela, puis-je définir le nom de projet par défaut dans mon fichier .docker-compose ?
Ou encore besoin de plus de discussions dans ce fil?

Stocker le nom du projet dans docker-compose.yml fichier

Ce serait formidable de le stocker dans le mĂȘme fichier YAML mais Ă©ventuellement de le remplacer si nĂ©cessaire.

Je pense que le cƓur de ce problĂšme vient du fait que le nom du projet par dĂ©faut est simplement (devrais-je dire _naively_?) Pris comme nom de base du rĂ©pertoire actuel. Cela compresse efficacement l'espace de noms du systĂšme de fichiers (hiĂ©rarchique) en un espace plat, ce qui pose problĂšme en raison des conflits de noms. Par exemple, cela pose des problĂšmes aux personnes exĂ©cutant des services dans ~/fooproject/master et ~/barproject/master .

Je pense que les noms de projets sont sans importance. Alors peut-ĂȘtre qu'un moyen de rendre docker-compose robuste est de gĂ©nĂ©rer des noms de projets basĂ©s sur le chemin complet (ie home_flaviovs_fooproject_master )?

J'aime l'idĂ©e persistante, cependant. Pouvoir valider le nom du projet dans Git est un cas d'utilisation courant. Peut-ĂȘtre que lire un fichier .env.default avant .env est une solution simple pour cela (quel BTW prendrait Ă©galement en charge le # 210 de longue date)?

J'ai rĂ©solu ce problĂšme en enveloppant le binaire docker-compose avec ma propre fonction afin que je puisse appeler la fonction de n'importe oĂč. Cela charge le fichier .env et utilise le bon fichier docker-compose n'importe oĂč.

Évidemment, vous pouvez Ă©tendre cela pour avoir une fonction par projet ou quelque chose. Je pense qu'il pourrait y avoir des inconvĂ©nients, mais je ne les ai pas dĂ©couverts.

DEFAULT_DOCKER_COMPOSE=~/my-project

function dcompose() {
    pushd $DEFAULT_DOCKER_COMPOSE &> /dev/null;
    /usr/local/bin/docker-compose $@;
    popd &> /dev/null;
}
## maintain auto complete
function _dc {
    pushd $DEFAULT_DOCKER_COMPOSE &> /dev/null;
    _docker_compose;
    popd &> /dev/null;
}

complete -F _dc dcompose

J'ai un problĂšme avec la collision d'images, et il semble vraiment Ă©trange que je ne puisse pas dĂ©finir project_name dans le docker-compose.yml car cela semble trĂšs logique et une solution directe. En fait, prendre le nom du dossier du projet en premier lieu Ă©tait une mauvaise idĂ©e. Dans de nombreux cas, les dossiers de projets peuvent ĂȘtre comme / home / project1 / repository, / home / project2 / repository et ainsi de suite, dans ce cas, docker a gĂ©nĂ©rĂ© les mĂȘmes noms d'images que repository_app.

@vedmant Vous pouvez définir le nom de l'image dans docker-compose.yml , utilisez simplement image et build .

Alors ... Que diriez-vous maintenant sĂ©parĂ©s par des projets sur un dossier du mĂȘme nom?

docker-compose -f /foo/bar up -d
docker-compose -f /foo/foo/foo/bar down

Peut-ĂȘtre que cela a dĂ©jĂ  Ă©tĂ© proposĂ©. mais pourquoi ne pas faire un changement radical dans version: 4 et ajouter un nouveau mot-clĂ© pour permettre de dĂ©finir le nom du projet Ă  partir de docker-compose.yml ?

mon .docker-compose / nom-de-projet n'a pas fonctionné ...
--project-name a fonctionné

Je voudrais également définir le nom du projet dans le fichier docker-compose.yml.

Mon cas d'utilisation est, j'ai un fichier docker-compose.yml qui a une application Web et un service de base de données postgress.
Je veux aussi des fichiers docker-compose.yml sĂ©parĂ©s pour les tĂąches adhoc - dĂ©crivant essentiellement les tĂąches adhoc que j'aimerais orchestrer avec docker-compose. Ces tĂąches ad hoc doivent tirer parti des mĂȘmes services / rĂ©seaux / volumes que ceux utilisĂ©s dans le projet principal.

Un exemple de tĂąche ad hoc que j'aimerais orchestrer avec docker-compose pourrait ĂȘtre. migration des donnĂ©es dans la base postgress donnĂ©es

Donc, pour y parvenir, je peux crĂ©er un fichier docker-compose.adhoctask.yml sĂ©parĂ© pour reprĂ©senter la tĂąche, afin que je puisse exĂ©cuter cette tĂąche Ă  la demande uniquement lorsque cela est nĂ©cessaire. Parce qu'il se trouve dans le mĂȘme rĂ©pertoire que le fichier original de docker-compose, il obtient le mĂȘme nom de projet par dĂ©faut et a donc accĂšs aux mĂȘmes rĂ©seaux, volumes, etc.? et tout fonctionne.

Cependant, le problĂšme survient lorsque je ne veux pas que ce fichier yml de tĂąche adhoc vive dans le mĂȘme rĂ©pertoire de niveau supĂ©rieur (ou mĂȘme le mĂȘme dĂ©pĂŽt) que le docker-compose.yml . Par exemple, je veux peut-ĂȘtre mettre la tĂąche ad hoc docker-compose.adhoc.yml dans un sous-dossier, avec les DOCKERFILE et les actifs dont la tĂąche a besoin bien isolĂ©s / regroupĂ©s, car c'est sa propre prĂ©occupation. DĂšs que je le dĂ©place dans un sous-dossier, son nom de projet ne correspond plus. Cela signifie qu'il n'a plus accĂšs aux mĂȘmes volumes / rĂ©seaux, etc. dĂ©finis dans le projet principal.

Si je pouvais spĂ©cifier les projectname dans les docker-compose.yml et docker-compose.adhoc.yml - alors je pourrais les structurer comme je veux (mĂȘme les mettre dans des repo sĂ©parĂ©s) et toujours les exĂ©cuter sans avoir Ă  SpĂ©cifiez constamment des arguments de ligne de commande supplĂ©mentaires ou changez de variables d'environnement.

C'est un vrai problĂšme pour moi, car cela provoque des conflits de noms

J'ai plusieurs projets dans la structure

/company
    /ab   # project prefix
        /backend   # actual project
        /webapp
    /cd
        /backend
        /webapp

maintenant, lorsque je lance un docker-compose dans un projet, il crĂ©e un rĂ©seau backend_default et des prĂ©fixes de conteneurs qui ne sont pas explicitement nommĂ©s avec backend_ .. maintenant Si je veux dĂ©marrer l'autre projet, j'ai pour revenir au bon dossier et exĂ©cuter d'abord docker-compose down pour Ă©viter les conflits - sinon, il crĂ©erait de nouveaux conteneurs dans le mĂȘme rĂ©seau, puis en les dĂ©sactivant, il se plaindrait d'orhans, quand il n'y en a pas.

Aussi un problÚme pour moi. J'ai plusieurs projets et j'utilise docker-compose pour des stands de démonstration dynamiques sur une seule machine, un support par branche.

/project-1
    /dev # docker-compose.yml inside
    /master # docker-compose.yml inside
    /feature
        /new-feature # docker-compose.yml inside
/project-2
    /dev # docker-compose.yml inside
    /master # docker-compose.yml inside

Ainsi, "maßtres" et "développeurs" sont en conflit entre les projets. Un fichier .docker-compose pourrait résoudre ce problÚme.

@simplesmiler Au risque de me répéter, un .env résout déjà cela.

@ shin- .env est souvent utilisé pour les secrets qui ne sont pas dans le contrÎle de version.

Ce que @simplesmiler veut, c'est un moyen de valider le nom du projet dans le contrĂŽle de version _ tout en gardant .env dehors du contrĂŽle de version_.

Pour autant que je sache, il n'y a toujours aucun moyen de le faire facilement.

@thedeeno ce n'est pas ce que leur message dit. Travaillez-vous ensemble? Sinon, nous ne devrions pas présumer que le cas d'utilisation de quelqu'un d'autre est au-delà de ce qui est explicitement écrit.

Nous ne travaillons pas ensemble. C'est mon interprĂ©tation de leur problĂšme. Tout Ă  fait juste, je me trompe peut-ĂȘtre et je prĂ©sume.

J'aurais aimé que nous travaillions ensemble pour que nous puissions prendre un café. J'espÚre que vous ne pensez pas que je suis un imbécile ici.

Peut-ĂȘtre que je me souviens de ce fil de maniĂšre incorrecte: existe-t-il un moyen de valider le nom du projet dans le contrĂŽle de version tout en gardant .env ignorĂ©?

Existe-t-il un moyen de valider le nom du projet dans le contrÎle de version tout en gardant .env ignoré? Ou est-ce toujours une capacité manquante?

Pas actuellement. Comme je l'ai mentionnĂ© il y a quelques mois ^ 1, le plan est d'avoir docker-compose.env comme fichier d'environnement secondaire pouvant ĂȘtre inclus dans le contrĂŽle de version. Il a quelque peu glissĂ© dans la liste des prioritĂ©s, mais j'espĂšre y arriver bientĂŽt.

1 / https://github.com/docker/compose/issues/745#issuecomment -345054893

Ce sont de bonnes nouvelles! Accepter les RP?

J'ai perdu espoir il y a longtemps, mais essayons Ă  nouveau:

Je pense que beaucoup ici ne comprennent toujours pas pourquoi nous sommes obligés de maintenir un deuxiÚme fichier pour ce paramÚtre.

Si je comprends bien, pour quelques-uns ici, cela rompt la configuration de leur projet. Mais pour la majorité dans ce fil, ce ne serait

Cela n'a mĂȘme pas de sens en toute logique: l'absence de ce paramĂštre dans docker-compose.yml est si Ă©vidente que je ne pouvais mĂȘme pas croire que cette option Ă©tait manquante lorsque je l'ai recherchĂ©e dans le manuel. Presque tous les autres aspects de votre configuration peuvent y ĂȘtre configurĂ©s. Pour moi, c'est une rupture si claire dans la logique de configuration.

Je pense que l'on pourrait dire que (presque) tous les paramĂštres de docker-compose.yml sont "Ă©tendus" par le nom du

Comme suggĂ©rĂ© dans # 4841, une option pour spĂ©cifier quel fichier .env utiliser (ie --env-file ) devrait ĂȘtre trĂšs utile.

Merci @ schmunk42.
Mais cela signifie que je dois créer une hiérarchie comme:

.
├── project_a
│   ├── .env
├── project_b
│   ├── .env

au lieu de quelque chose de plus simple comme:

.
├── a.env
├── b.env

Oui, voir aussi https://github.com/docker/compose/issues/745#issuecomment -345054893 - vous devrez peut-ĂȘtre l'ouvrir dans une nouvelle fenĂȘtre, car elle est parfois cachĂ©e ici : nerd_face:

J'appuie la proposition --env-file . J'ai fait un ticket juste pour ça. Allez-y et aimez-le si vous voulez cette option.

Je n'ai donc lu que quelques commentaires sur ce bogue / fonctionnalité, et le fait que la discussion se poursuive et qu'elle soit ouverte m'amÚne à la conclusion que cela fait 4 ans que cela a été initialement ouvert et qu'il n'y a toujours pas de solution? Pouvons-nous prendre une décision partielle et ensuite aller de l'avant ..?

J'admets que je n'ai pas lu tout ce numéro et toutes les questions connexes, mais il y a des problÚmes intéressants autour de ce sujet qui rendent cela plus compliqué qu'il n'y paraßt à premiÚre vue. Par exemple, comme nous le savons tous, .env est couramment utilisé pour les valeurs secrÚtes, donc vous l'ignorez généralement du contrÎle de version.

Mais disons que vous travaillez avec Stripe, ce qui vous permet d'avoir des clés de test et des clés live, AKA. 2 jeux de clés avec lesquels travailler. En développement, il serait trÚs courant que vous utilisiez les clés de test, et en production, vous finiriez par utiliser les clés dynamiques.

Cela signifie automatiquement que vous ne pouvez pas utiliser .env seul pour traiter les valeurs secrÚtes, car vous aurez des clés différentes dans chaque environnement, et vous ne voulez pas avoir à changer les valeurs de votre fichier entre l'exécution de votre app en dev ou prod (ce serait fou et trÚs sujet aux erreurs).

Ce que vous finirez probablement par créer à la fois un fichier .env et .env.prod et ignorer les deux depuis le contrÎle de version. De cette façon, vous pouvez avoir vos clés de test / dev en développement, puis les référencer avec env_file dans votre fichier de composition de développement.

Mais alors en production, vous faites référence à la fois .env et .env.prod dans votre fichier de composition de production.

Mais voyez-vous oĂč cela va? Pour le moment, Docker Compose ne vous permet pas d'avoir des fichiers optionnels env_file . Si le fichier n'existe pas, Docker Compose va exploser dĂšs que vous essayez d'exĂ©cuter Docker Compose.

Donc, vous avez automatiquement besoin d'un fichier .env pour exister à la fin si vous prévoyez de l'utiliser avec env_file et ce n'est pas limité à Stripe non plus. De nombreux frameworks Web ont certains paramÚtres spécifiques à l'environnement mais qui changeraient à la fois en développement et en production (par exemple SERVER_NAME avec Flask).

Cela signifie que nous sommes limités à avoir quelque chose comme un fichier .env_example que vous engagez dans le contrÎle de version et il est prévu que l'utilisateur final renomme ce fichier en .env , puis à l'intérieur de ce fichier contiendra notre vieil ami COMPOSE_PROJECT_NAME .

Ce qui soulÚve maintenant la question. Avons-nous réellement besoin d'une autre maniÚre de définir le nom du projet? Je ne suis pas convaincu que ce soit le cas, mais je suis convaincu que la définition d'un nom de projet personnalisé est une bonne idée dans n'importe quel projet, ou du moins autre chose que le nom du dossier, car vous pouvez facilement rencontrer des conflits de nom.

Ce problĂšme est-il sur une feuille de route s'il vous plaĂźt?

Le cas d'utilisation pour cela serait de modifier le COMPOSE_PROJECT_NAME dans le cas oĂč votre projet a plusieurs fichiers docker-compose (par exemple un pour dev, test, peut-ĂȘtre une base, peut-ĂȘtre un test local, etc.) Vous pourriez avoir besoin de tourner jusqu'Ă  2 environnements trĂšs diffĂ©rents et sĂ©parĂ©s les uns des autres.

Dans notre cas, nous pouvons contourner cette limitation de docker-compose en créant le COMPOSE_PROJECT_NAME dans notre makefile.

Je voudrais voir cela configurable Ă  partir du composant yaml lui-mĂȘme.

Est-ce toujours ouvert? Oh mon Dieu...

Abonné. Je veux également pouvoir définir le nom du projet sur le fichier yaml de composition.

Cela prend une Ă©ternitĂ© đŸ€Šâ€â™‚

serait trÚs utile d'avoir cette fonctionnalité

cette fonctionnalité serait la bienvenue dans le projet sur lequel je travaille

Ok, donc Ă  partir de ce long fil de discussion, nous pouvons conclure que le nom du projet ne sera pas dans le fichier docker-compose.yml, car les principaux dĂ©veloppeurs sont contre cela et ne fusionneront aucune requĂȘte de ce type.

Alors, pouvons-nous s'il vous plaĂźt revenir Ă  la proposition originale en haut de ce numĂ©ro: rendre le nom du projet persistant. Utiliser un fichier .docker-compose ou un rĂ©pertoire .docker-compose me convient parfaitement. Mais ce serait bien si nous pouvions enfin progresser dans la mise en Ɠuvre de cela.

J'ajouterais une variable ENV Ă  cette liste d'alternatives.

Une racine substantielle de tout le dĂ©saccord est que ce fil / problĂšme est que pour beaucoup de gens cela ne fonctionne pas s'il est dans une variable ENV. Ils veulent pouvoir le valider dans un repo (facultatif bien sĂ»r, la recommandation standard peut ĂȘtre de ne pas le valider.)

L'avoir ENV plutĂŽt que le contenu de yaml est en contradiction avec la philosophie de partage de fichiers yaml entre diffĂ©rents projets. En fait, il est officiellement documentĂ©: https://docs.docker.com/compose/extends/ (voir "Exemples de cas d'utilisation" par exemple). Si vous utilisez un fichier yaml de base unique, puis remplacez les fichiers pour dev, test et prod, et que Dieu sait quoi d'autre, cela n'a aucun sens de l'exĂ©cuter sous le mĂȘme nom de projet ou de dĂ©finir le nom du projet par ENV / cli. Il crĂ©era simplement N * N combinaisons tandis que sur N sont valides.

J'ai parcouru plusieurs de ces discussions et j'ai vu une tonne de commentaires de personnes souhaitant que le nom du projet soit configurable dans le fichier YML. Mais pas un seul commentaire expliquant pourquoi cela ne devrait pas ĂȘtre fait. Ces discussions remontent Ă  un long chemin.

En tant que personne Ă  la recherche d'une solution facile Ă  utiliser et constatant qu'il n'y a pas de moyen facile de dĂ©finir le nom du projet qui ne nĂ©cessite pas une attention particuliĂšre de l'utilisateur Ă  la ligne de commande exĂ©cutĂ©e (qui est en concurrence avec l'idĂ©e de base d'un outil pour lequel vous passer up et dĂ©marrer comme par magie un cluster complet de serveurs) - Je suis choquĂ© que ce soit une question ouverte. S'il y avait une explication claire des raisons pour lesquelles la mise en Ɠuvre est problĂ©matique ou prĂ©occupante, je serais intĂ©ressĂ©.

une solution Ă©lĂ©gante pourrait ĂȘtre d'utiliser un espace rĂ©servĂ© dans la propriĂ©tĂ© container_name (et d'autres noms dynamiques tels que volume, rĂ©seau, ...)

services:
  my_service:
    container_name: {project_name}_{service_name}_{instance_number} # default value

avec une telle configuration, on pourrait utiliser

services:
  my_service:
    container_name: fixedprojectname_{service_name}_{instance_number}

edit: ce n'est pas une solution parfaite, car cela va entrer en conflit pour les personnes qui utilisent 2 projets distinguĂ©s dans le mĂȘme nom de dossier

@jderusse

une solution Ă©lĂ©gante pourrait ĂȘtre d'utiliser un espace rĂ©servĂ© dans la propriĂ©tĂ© container_name (et d'autres noms dynamiques tels que volume, rĂ©seau, ...)

services:
  my_service:
    container_name: {project_name}_{service_name}_{instance_number} # default value

avec une telle configuration, on pourrait utiliser

services:
  my_service:
    container_name: fixedprojectname_{service_name}_{instance_number}

edit: ce n'est pas une solution parfaite, car cela va entrer en conflit pour les personnes qui utilisent 2 projets distinguĂ©s dans le mĂȘme nom de dossier

Je fais également cela et je pensais que cela résoudrait le problÚme de conflit, bien que nous devions toujours définir la variable COMPOSE_PROJECT_NAME sur une valeur unique sur le fichier .env .

À ce stade, je veux vraiment comprendre la raison pour laquelle les responsables rejettent les solutions. Il existe dĂ©jĂ  une pull request pour une solution.

Une fois que nous savons ce qui ne va pas, nous pouvons travailler Ă  le rĂ©parer. À ce stade, je ne vois aucun commentaire autre que «rejeté».

Nous avons ces 2 commentaires:

https://github.com/docker/compose/issues/745#issuecomment -345054893
https://github.com/docker/compose/issues/745#issuecomment -346487757

Mais je dois admettre que mĂȘme en lisant ces commentaires, je ne comprends pas tout Ă  fait pourquoi ne pas simplement ajouter le nom_projet au fichier yaml. Pour ceux qui pensent que cela rend leurs fichiers docker-compose.yaml moins gĂ©nĂ©raux, ils ne devraient tout simplement pas mettre le nom dans le fichier yaml, mais laissez le reste d'entre nous avoir la possibilitĂ© de le faire.

OK, je fais de mon mieux pour lire les références à d'autres commentaires; J'apprécierais vraiment au moins une courte présentation faisant référence au contenu de la référence, en plus de la référence pour m'assurer que je lis la bonne chose et que j'obtiens le bon contenu.

Permettez-moi de résumer ce que je vois sont les préoccupations. Toute aide pour clarifier cela serait appréciée.

(1) L'ajout d'un nom de projet au fichier YML peut rendre le projet moins rĂ©utilisable car cela empĂȘcherait, ou au moins compliquerait, l'exĂ©cution d'un fichier YML avec plus d'un nom de projet.
(2) "la qualité du projet en souffrirait trop pour justifier son ajout (sous cette forme)"
(3) "Si le nom du projet est dans le fichier de composition, deux projets pourraient utiliser le mĂȘme nom, provoquant un conflit, ce qui interromprait les deux projets."

J'ai des réflexions à ce sujet, mais je vais attendre mes commentaires jusqu'à ce que nous puissions nous mettre d'accord sur les préoccupations à régler. Est-ce raisonnable?

(4) Implémentation de maniÚre rétrocompatible (priorité / ordre des valeurs)

(1) L'ajout d'un nom de projet au fichier YML peut rendre le projet moins rĂ©utilisable car cela empĂȘcherait, ou au moins compliquerait, l'exĂ©cution d'un fichier YML avec plus d'un nom de projet.

Encore une fois, il existe un moyen officiel de diviser la configuration en base et en fichier et héritée - https://docs.docker.com/compose/extends/. On n'a pas pu configurer le nom du projet dans la configuration de base.

Pour moi, le cas d'utilisation principal que je recherche est la capacité à exécuter plusieurs instances du projet localement (développement, environnements de test, etc.).

Peut-ĂȘtre que la solution est de vous permettre de dĂ©finir le nom du projet explicitement ou un chemin de parcours.

Si je définis explicitement le nom du projet dans le fichier yaml comme my-project je peux simplifier les choses pour une seule instance d'un projet ou lorsque je fais quelque chose comme ajouter tous mes fichiers docker dans un dossier docker sur plusieurs projets.

.
├── project_a
│   ├── docker
│   │   ├── docker-compose.yml (project_name: my-project)
├── project_b
│   ├── docker
│   │   ├── docker-compose.yml (project_name: some-other-project)

Mais cela n'aide pas avec plusieurs instances du mĂȘme projet, alors que diriez-vous de faire quelque chose avec le parcours de chemin

project_name: ../(*) donc avec le mĂȘme exemple

.
├── project_a
│   ├── docker
│   │   ├── docker-compose.yml (project_name=project_a)
├── project_b
│   ├── docker
│   │   ├── docker-compose.yml (project_name=project_b)
├── project_b_copy
│   ├── docker
│   │   ├── docker-compose.yml (project_name=project_b_copy)

de mĂȘme project_name: ../(../*)

.
├── dev
│   ├── project_a
│   │   ├── docker
│   │   │   ├── docker-compose.yml (project_name=dev_project_a)
├── test
│   ├── project_a
│   │   ├── docker
│   │   │   ├── docker-compose.yml (project_name=test_project_a)

comment spĂ©cifier le parcours devrait probablement ĂȘtre pensĂ© un peu plus en profondeur que mon pouce, mais au moins en faisant cela, je pense que nous avons la flexibilitĂ© de couvrir tous les cas d'utilisation.

Seulement à moitié en plaisantant: cela signifie que pour configurer un nom fixe dans mon docker-compose.yml, je créerais un fichier avec le nom que je veux, puis définirais project_name: name-of-the-file-named-like-the-name-i-want ?

J'ai actuellement une charge de fichiers docker-compose dans le mĂȘme rĂ©pertoire. Comme dc-work.yml , dc-server.yml , etc., qui chargent tous des services diffĂ©rents et non liĂ©s.

Quand j'exécute docker-compose up dc-A.yml , puis que j'exécute docker-compose up dc-B.yml , Docker me dit qu'il y a des services orphelins en cours d'exécution (bien sûr qu'il n'y en a pas, c'est à cause du nom du projet).

N'y a-t-il vraiment aucun moyen de rĂ©soudre ce problĂšme? DĂ©placer chaque fichier dc-A|B|C|etc.yml dans son propre rĂ©pertoire, puis parcourir chacun pour charger tous mes services semble ĂȘtre une vĂ©ritable perte de temps, ou est-ce que je manque quelque chose?

Pourquoi ce problÚme n'a-t-il pas été résolu? La solution claire et simple a été présentée par @ cr7pt0gr4ph7 ici: https://github.com/docker/compose/issues/745#issuecomment -182296139. Il a reçu beaucoup de votes. Chaque préoccupation a été abordée dans la discussion. Et, plus important encore, cela résout de nombreux problÚmes pour beaucoup de gens. Ce qui donne?

Nous rencontrons Ă©galement ce problĂšme car nous utilisons une structure de rĂ©pertoire de projet fixe avec un dossier .docker qui contient tous les Ă©lĂ©ments liĂ©s Ă  docker, donc je me retrouve avec beaucoup de noms de projet .docker - je travaille sur une architecture de microservices il est donc normal d'en avoir plusieurs ... mais cette petite chose ne cesse de gĂȘner -> aussi, PHPStorm etc. n'a pas la possibilitĂ© de passer l'argument -p / - project-dir et je ne peux pas vraiment utiliser un .env pour cela car, croyez-moi, dĂ©finir la bonne valeur sera oubliĂ© ...

Développeurs, veuillez nous indiquer comment vous souhaitez qu'il soit résolu.

Peut-ĂȘtre ajouter une propriĂ©tĂ© au fichier docker-compose pour dĂ©finir le nom du projet?

@AyushyaChitransh

Développeurs, veuillez nous indiquer comment vous souhaitez qu'il soit résolu.

Voici le meilleur résumé:
https://github.com/docker/compose/issues/745#issuecomment -182296139

Il y a eu beaucoup de discussions. Il n'est pas nécessaire de poursuivre la discussion. Les responsables du projet ont juste besoin de lire les threads (pluriel) et de faire le nécessaire.

Pour moi, c'est toujours ça: https://github.com/docker/compose/issues/745#issuecomment -248644429

Pour moi c'est toujours ça: # 745 (commentaire)

Oui, il existe une solution existante, mais médiocre. Ces commentaires ont été rejetés et les problÚmes ont été clairement énoncés par beaucoup. Les commentaires liés ne répondent tout simplement pas à la plupart des préoccupations légitimes soulevées dans ces fils.

Tbh, c'est un peu discutable. Beaucoup d'entre nous sont passés à Kubernetes pour docker-compose fonctionnalité de type

@AyushyaChitransh
Nous voulons utiliser un mécanisme pour définir le nom du projet comme décrit ici: https://github.com/docker/compose/issues/745#issuecomment -182296139

  1. Ligne de commande arg.
  2. Variable d'environnement (fichier .env)
  3. Dans le fichier Compose directement
  4. Chemin du dossier

Ne pensez pas qu'il y ait d'objection Ă  cela.

Il y a, il s'agit de portabilitĂ©, comme mentionnĂ© ci-dessus, en quelque sorte similaire lors de l'utilisation de container_name , qui ne devrait pas non plus faire partie du docker-compose.yml . Vous ne pouvez pas rĂ©utiliser la mĂȘme configuration avec les paramĂštres existants.

Si votre flux de travail doit s'appuyer sur le chemin du dossier et que project-name est injectĂ© dans votre configuration, par exemple. grĂące Ă  la fusion, plusieurs fichiers de composition, modĂšles, ... - vous vous retrouverez avec le mĂȘme problĂšme - Ă©craser les piles existantes.

DĂ©solĂ© de dire cela, mais cela devrait ĂȘtre fermĂ© comme wontfix .. (modifier) ​​ou publier une nouvelle version MAJEUR (!)

@ schmunk42

Si votre flux de travail repose sur le chemin du dossier et que le nom du projet est injectĂ© dans votre configuration, par exemple. grĂące Ă  la fusion, plusieurs fichiers de composition, modĂšles, ... - vous vous retrouverez avec le mĂȘme problĂšme - Ă©craser les piles existantes.

PremiÚrement, le nom du projet ne serait défini dans les fichiers de composition que par ceux qui en ont besoin et c'est précisément parce qu'ils veulent que les fichiers de composition fonctionnent avec les piles existantes. Vous pouvez ajouter votre avertissement aux documents autour de ce paramÚtre.
DeuxiÚmement, pour ceux qui reposent sur un nom de projet spécifique, considérez ceci:

  1. Que faire si le fichier de composition est tĂ©lĂ©chargĂ© Ă  partir d'un dĂ©pĂŽt git, puis lors du prochain commit, le propriĂ©taire du dĂ©pĂŽt le dĂ©place vers un sous-dossier diffĂ©rent? Ou renommĂ© le dossier dans lequel il se trouve? L'impact sur le flux de travail est dĂ©jĂ  prĂ©sent car les fichiers peuvent ĂȘtre dĂ©placĂ©s et cela affecte le nom du projet.
  2. Si vous comptez sur un nom de projet spécifique, nous avons proposé le mécanisme pour le garantir, soit en utilisant la variable d'environnement (fichier .env), soit en utilisant la ligne de commande arg lors de l'exécution de Docker compose - les deux remplaceraient toute valeur qui se trouvait dans le fichier de composition (si un fichier a été ajouté pour une raison quelconque).

Fermer ceci comme wontfix n'est pas trÚs utile sans expliquer pourquoi ce qui précÚde n'est pas assez bon .. ou offrir un chemin vers une solution.

Je ne veux pas que mon flux de travail (ou plutÎt le flux de travail de toute mon équipe) dépende du nom du dossier dans lequel ils extraient le code.

Mon principal problĂšme avec la solution de fichier .env est que ce fichier doit ĂȘtre dans le rĂ©pertoire de travail de l'exĂ©cution de la commande - alors que docker-compose rĂ©sout le fichier de composition dans un rĂ©pertoire parent. Il devient donc essentiel que tous les dĂ©veloppeurs (A) extraient le code dans le dossier du mĂȘme nom (en supposant un fichier docker-compose.yml Ă  la racine d'un rĂ©fĂ©rentiel de code) ou (B) exĂ©cutent uniquement les commandes docker-compose dans le dossier racine du dĂ©pĂŽt crĂ©e sinon des piles en conflit ou (C) ils ont des noms de pile diffĂ©rents et toute la documentation et les scripts doivent dire replace stack name here .

Si (C) est ce que docker suggĂšre comme solution `` portable '' recommandĂ©e, la CLI docker-compose doit ĂȘtre complĂšte avec les commandes CLI de docker et, mĂȘme dans ce cas, je vois toujours un cas d'utilisation pour cette fonctionnalitĂ©.

Si votre flux de travail repose sur le chemin du dossier et que le nom du projet est injectĂ© dans votre configuration, par exemple. grĂące Ă  la fusion, plusieurs fichiers de composition, modĂšles, ... - vous vous retrouverez avec le mĂȘme problĂšme - Ă©craser les piles existantes.

Si un nom de projet est ajoutĂ© au fichier docker-compose, il est certainement lĂ  pour une raison (comme toutes les autres lignes d'un fichier docker-compose). Malheureusement, en ce moment, mĂȘme en renommant simplement mon dossier extrait (sans effectuer de modifications suivies dans git), j'obtiens Ă©galement un systĂšme cassĂ©.

Je ne peux pas croire que nous sommes en 2020 et nous n'avons toujours pas rĂ©solu cet Ă©norme cas d'utilisation. Ce n'est pas un changement radical, c'est une fonctionnalitĂ© totalement optionnelle et qui a tout son sens. Étant donnĂ© que Kubernetes est maintenant l'outil de dĂ©ploiement par dĂ©faut pour docker, j'imagine que docker-compose pour voir principalement l'utilisation dans le dĂ©veloppement / les dĂ©ploiements locaux et avoir un fichier docker-compose Ă  la racine d'un rĂ©fĂ©rentiel pour exĂ©cuter le code dans le dĂ©pĂŽt localement est un trĂšs populaire cas d'utilisation.

@ dc-pm a Ă©crit: "Étant donnĂ© que Kubernetes est maintenant l'outil de dĂ©ploiement de facto pour docker"

Je n'Ă©cris plus de fichiers docker-compose. Il n'y a pas assez d'avantages pour quelque chose qui ne verra pas la production. Kubernetes a aussi ses bizarreries. Mais il est largement pris en charge par les fournisseurs de cloud.

À vrai dire, mĂȘme gĂ©rer les conteneurs dans mon environnement de dĂ©veloppement est trop compliquĂ© au quotidien. Je viens de lancer les programmes ...

@ dc-pm a Ă©crit:

Je ne peux pas croire que nous sommes en 2020 et nous n'avons toujours pas résolu cet énorme cas d'utilisation.

Ce n'est pas seulement que cela n'a pas été corrigé, mais que les développeurs refusent activement de le réparer.

Le problĂšme, je soupçonne, est que les adolescents qui dĂ©veloppent ce logiciel n'ont pas l'expĂ©rience approfondie pour comprendre les implications de ce cas d'utilisation, ou Ă©couter le grand nombre de leurs utilisateurs plus expĂ©rimentĂ©s qui demandent qu'il soit traitĂ©. À ce stade, je doute qu'ils aient travaillĂ© dans un environnement avec plus d'un stack, ou peut-ĂȘtre mĂȘme en Ă©quipe. Sinon, franchement, _ ce serait une amĂ©lioration parfaitement Ă©vidente! _

Quelques rappels amicaux ...
Les développeurs open source ne sont pas vos "employés / collÚges", dans la plupart des cas, ils travaillent principalement gratuitement.
Si c'est clairement un problĂšme pour vous, prenez le temps de rechercher des solutions (et de pousser un PR).

Le blĂąme n'est pas la solution.

https://github.com/docker/code-of-conduct/blob/master/code-of-conduct-EN.md

C'est assez difficile de pousser un changement quand les développeurs y sont opposés ...

Le sam, 14 mars 2020 Ă  03:19, Antoine Gravelot [email protected]
a Ă©crit:

Quelques rappels amicaux ...
Dans la plupart des cas, les développeurs Open Source ne sont pas vos «employés / collÚges»
ils travaillent principalement gratuitement.
Si c'est clairement un problĂšme pour vous, prenez le temps de rechercher des solutions
et pousser un PR.

Le blĂąme n'est pas la solution.

https://github.com/docker/code-of-conduct/blob/master/code-of-conduct-EN.md

-
Vous recevez ceci parce que vous avez commenté.
RĂ©pondez directement Ă  cet e-mail, affichez-le sur GitHub
https://github.com/docker/compose/issues/745#issuecomment-598991880 , ou
Se désabonner
https://github.com/notifications/unsubscribe-auth/ABAXP2DRD7H4YI7KQ7B2URLRHLLQ5ANCNFSM4AZMCNWA
.

@agravelot Je pense qu'il y a eu des PR, ce n'est peut-ĂȘtre pas l'idĂ©al. Mais Ă  travers toutes les discussions, les propriĂ©taires s'attendent trĂšs clairement Ă  ne pas vouloir cette fonctionnalitĂ©. Ce n'est pas une question de codage.

@agravelot désolé pour le retard. Et je ne voulais vraiment pas manquer de respect aux nombreuses personnes formidables et talentueuses qui contribuent ici. Mais blùmer un manque d'effort n'est pas non plus utile.

Je souligne simplement le soutien d'une idĂ©e qui n'a pas Ă©tĂ© Ă©coutĂ©e Ă  maintes reprises malgrĂ© un soutien clair sur une trĂšs longue pĂ©riode. Le point entier de ceci (et OSS en gĂ©nĂ©ral) tel que dĂ©fini dans notre code de conduite est de permettre aux gens de contribuer au code et d'ĂȘtre respectueux de toutes les idĂ©es.

Il y a déjà eu plusieurs pull requests créées mais si cela peut aider la situation, je suis trÚs heureux d'en créer une autre.

Quelle serait une voie Ă  suivre plus constructive?

Il y a déjà eu plusieurs pull requests créées mais si cela peut aider la situation, je suis trÚs heureux d'en créer une autre.

Oui, les dĂ©veloppeurs devraient continuer Ă  les passer en revue, ou fermer ceci comme "Won't fix" (peut-ĂȘtre en argumentant) ... Garder cela ouvert pendant des annĂ©es, sans commentaires officiels, c'est juste perdre le temps des contributeurs (au sens le plus large) ). C'est aussi un manque de respect, OMI.

HĂ©, les gars, en tant qu'utilisateur, je voulais simplement partager mon cas d'utilisation. J'ai donc 2 fichiers docker-compose.yml, un pour l'environnement de dĂ©veloppement, un pour la production. Ils sont situĂ©s dans le mĂȘme dossier. Ils ont tous deux un service avec le mĂȘme nom - appelĂ© "base de donnĂ©es". J'aimerais dĂ©ployer ces deux services en mĂȘme temps - simplement parce que je le peux, c'est de la conteneurisation dont nous parlons, je peux Ă©voluer autant que je veux. Cependant, ils ont des valeurs "container_name" diffĂ©rentes.

Alors je cours:

macbook@fuck-fuck autocat-server % docker-compose -f ./compose-dev.yml up -d database
Creating network "autocat-server_autocat-dev" with the default driver
Creating database-dev ... done
macbook@fuck-fuck autocat-server % docker-compose -f ./compose-prod.yml up -d database
Creating network "autocat-server_autocat-prod" with the default driver
Recreating database-dev ... done

Notez comment il est dit "Recréer la base de données-dev" alors que je fais clairement référence au service situé dans le projet "prod". Remplace en fait le conteneur existant. La base de données se termine et le conteneur est remplacé par ce dernier.

Je fais cela en partant du principe que des fichiers séparés "docker-compose.yml" signifient des projets séparés, mais apparemment ce n'est pas une chose dans la vraie vie. Le projet sur lequel le service est déployé est déterminé par l'emplacement du "docker-compose.yml". Pour les faire faire partie de projets séparés, je dois spécifier séparément le nom du projet dans une variable d'environnement. Cela fonctionne enfin avec ceci:

macbook@fuck-fuck autocat-server % COMPOSE_PROJECT_NAME=autocat-prod docker-compose -f ./compose-prod.yml up -d database
Creating network "autocat-prod_autocat-prod" with the default driver
Creating database-prod ... done
macbook@fuck-fuck autocat-server % COMPOSE_PROJECT_NAME=autocat-dev docker-compose -f ./compose-dev.yml up -d database
Creating network "autocat-dev_autocat-dev" with the default driver
Creating database-dev ... done

VoilĂ  pour le dĂ©ploiement Ă  commande unique, quelle blague absolue. À mon avis, .yml est l'endroit idĂ©al pour spĂ©cifier le nom du projet dans ce contexte.

Alternativement, j'ai pu placer les services dans un seul projet - en leur donnant des noms différents: "database-dev" et "database-prod". Le seul problÚme avec cette approche est qu'il existe un avertissement indiquant que le service précédemment instancié devient orphelin car il n'est pas mentionné dans l'autre docker-compose.yml.

macbook@fuck-fuck autocat-server % docker-compose -f ./compose-prod.yml up -d database-prod                
Creating network "autocat-server_autocat-prod" with the default driver
Creating database-prod ... done
macbook@fuck-fuck autocat-server % docker-compose -f ./compose-dev.yml up -d database    
WARNING: Found orphan containers (database-prod) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Creating database-dev ... done

Cela n'a aucun sens, pourquoi doit-il ĂȘtre comme ça. Pourquoi faut-il en fait qu'il en soit ainsi?

EDIT1: @ dc-pm @CharlieReitzel que pensez-vous? pouvez-vous donner un commentaire sur mon cas d'utilisation, juste au cas oĂč il serait invalide :)
EDIT2: j'ai mis les deux fichiers de composition dans des répertoires séparés et le tour est joué

sooo?

mainteneurs, quelqu'un ici?
les développeurs attendent pendant 6 ans!

Salut! J'ai créé un problÚme dans la spécification de composition pour ajouter le nom du projet au schéma de composition, car cela régit ce que nous pouvons ajouter au fichier de composition.
Une fois la propriété project-name ajoutée à la spécification de composition, nous pouvons démarrer l'implémentation dans docker-compose.

Cette page vous a été utile?
0 / 5 - 0 notes