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.
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
.
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
Il reste quelques points Ă discuter;
docker-compose init --project-name=foobar
)docker-compose destroy
)--file
) si leEt, dans un cadre plus large;
edit: renommé Fig en Compose
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;
--project-name=foobar
), qui peut ĂȘtre diffĂ©rent du nom de projet automatique..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:
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
--project-name
est fourni, utilisez-le (et Ă©crivez / mettez Ă jour le .project-name
? Pas sûr)--project-name
n'est fourni, mais FIG_PROJECT_NAME
est, utilisez FIG_PROJECT_NAME
(et Ă©crivez / mettez Ă jour vers .project-name
?).project-name
est défini, utilisez .project-name
.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:
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:
project_name
suffit.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:
--project-name
si spécifiéCOMPOSE_PROJECT_NAME
si spécifié.project_name
partir de docker-compose.yml
(ou partout oĂč ce paramĂštre est stockĂ©).basename
du répertoire du projetJe ne suis pas sûr de la priorité de 2 contre 3:
--project-name
, COMPOSE_PROJECT_NAME
devrait définitivement remplacer project_name:
.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
docker-compose up --build --remove-orphans
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
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:
-f
pour les exécuter)-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):
docker-compose.yml
COMPOSE_PROJECT_NAME
--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:
--project-name
(remplace toujours)COMPOSE_PROJECT_NAME
variable d'environnement(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:
- Procurationréseaux:
Procuration:
externe:
nom: proxyCe 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.
$ 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.
$ 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.
$ 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é):
-p
COMPOSE_PROJECT_NAME
de votre environnementCOMPOSE_PROJECT_NAME
de votre fichier .env
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é):
- 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?
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.
.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.)Ă 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
- 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)
- 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:
x-project-name
dans votre fichier Compose. Cette clé est ignorée par défaut.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.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
fichierproject_name
in docker-compose.yml
(Ă Ă©viter si docker-compose.yml
est distribué avec le projet)COMPOSE_PROJECT_NAME
de l'environnementCOMPOSE_PROJECT_NAME
from .env
(obsolÚte)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:
.env
mais cela ne fonctionne pas lorsque docker-compose est appelé depuis un autre emplacement (voir l' exemple de commandes , composer des fichiers )defined by the project, that can be checked in
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.
- 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:
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.ymlJe 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.
@roipoussiere voir https://github.com/docker/compose/issues/4841#issuecomment -414543951
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
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:
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.
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 lefig.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?