J'ai besoin d'ajouter quelques chemins à mon PATH dans docker-compose.yml
dans docker-compose.yml j'ai essayé
app:
...
environment:
- PATH /code/project
cependant, cela remplace simplement le PATH existant - alors que je veux ajouter au PATH existant
Un docker-compose.yml
ne vous offre aucun moyen d'étendre une variable d'environnement qui serait déjà définie dans une image Docker.
La seule façon pour moi de faire de telles choses est d'avoir une image Docker qui attend une variable d'environnement (disons ADDITONAL_PATH
) et qui étend au moment de l'exécution sa propre variable d'environnement PATH
avec elle.
Prenons le Dockerfile suivant:
FROM busybox
ENV PATH /foo:/bar
CMD export PATH=$PATH:$ADDITIONAL_PATH; /bin/echo -e "ADDITIONAL_PATH is $ADDITIONAL_PATH\nPATH is $PATH"
et le fichier docker-compose.yml suivant (dans le même répertoire que le fichier Dockerfile):
app:
build: .
Construisez l'image: docker-compose build
Et démarrez un conteneur: docker-compose up
, vous obtiendrez la sortie suivante:
app_1 | ADDITIONAL_PATH est
app_1 | PATH est/foo:/bar:
Modifiez maintenant le fichier docker-compose.yml en:
app:
build: .
environment:
- ADDITIONAL_PATH=/code/project
Et démarrez un conteneur: docker-compose up
, vous obtiendrez maintenant le résultat suivant:
app_1 | ADDITIONAL_PATH est/code/projet
app_1 | PATH est/foo:/bar:/code/projet
Notez également une erreur de syntaxe dans votre fichier docker-compose.yml: il doit y avoir un caractère de signe égal (=
) entre le nom de la variable d'environnement et sa valeur.
environment:
- PATH=/code/project
au lieu de
environment:
- PATH /code/project
Je sais que c'est un vieux fil, mais je pense qu'il y a plusieurs choses qui peuvent être clarifiées.
Grâce au fichier docker-compose
, on ne peut s’adresser qu’aux variables de la machine hôte. Il est donc NON possible d’étendre le PATH de l’image à partir de docker-compose.yml:
app:
...
environment:
- PATH /code/project:$PATH
D'autre part, l'utilisation de la directive RUN ou CMD EXPORT ne suffira pas car les variables EXPORTÉES ne persistent pas dans les images. Puisque chaque directive Dockerfile génère une image intermédiaire, ces valeurs seront reflétées dans celles-ci et non dans l'image principale où vous en avez réellement besoin.
La meilleure option serait d'utiliser l'option de compilation dans docker-compose.yml
:
app:
build: .
et ajout de l'option ENV à un fichier Dockerfile:
ENV PATH /path/to/bin/folder:$PATH
Ceci est suggéré dans le numéro # 684 et je suggérerais également de rechercher une réponse: docker ENV vs RUN export .
La réponse de @ Thomasleveil ne fonctionne que pour les conteneurs construits directement à partir du fichier docker-compose (via la variable build
). Et vous n'avez aucun contrôle sur la commande exécutée.
J'avais besoin de cette fonctionnalité pour les conteneurs téléchargés depuis (notre) référentiel où cela ne fonctionne pas tout à fait.
J'ai trouvé une solution en utilisant entrypoint
et command
.
Ayons un conteneur de base base
et un autre, Java7
, basé sur celui-ci. Et enfin, certains dockers composent en utilisant le conteneur Java7
pour exécuter des tâches.
Probablement le fichier le plus important ici, entrypoint.sh
$ cat base/script/entrypoint.sh
#!/bin/bash
export PATH="$PATH_ADD:$PATH"
echo "Path modified to $PATH"
exec $@
Dockerfile pour le conteneur base
$ cat base/Dockerfile
FROM xxx
# copy entrypoint script that extends current PATH variable by PATH_ADD
COPY script/entrypoint.sh /usr/sbin
ENTRYPOINT ["/usr/sbin/entrypoint.sh"]
Dockerfile pour le conteneur Java7
$ cat Java7/Dockerfile
FROM base
# download Java7
curl ... /opt/Java/jdk7
ENV Java_HOME /opt/Java/jdk7
Commandes exécutées par docker-compose
$ cat sbin/run-app1.sh
exec $Java_HOME/bin/Java -version
$ cat sbin/run-app2.sh
exec $Java_HOME/bin/Java -version
Docker-compose en utilisant ceux-ci:
$ cat docker-compose.yml
version: '3'
services:
app1:
image: Java7
command: run-app1.sh
environment:
PATH_ADD: /app/sbin
volumes:
- "./sbin:/app/sbin:cached"
app2:
image: Java7
command: run-app2.sh
environment:
PATH_ADD: /app/sbin
volumes:
- "./sbin:/app/sbin:cached"
Structure de fichier
$ tree
.
├── base
│ ├── script
│ │ └── entrypoint.sh
│ └── Dockerfile
├── Java7
│ └── Dockerfile
├── sbin
│ ├── run-app1.sh
│ └── run-app2.sh
└── docker-compose.yml