web-dev-qa-db-fra.com

docker-compose en ajoutant à PATH

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

16
lukeaus

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
12
Thomasleveil

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 .

0
Rocksn17

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
0
Petr Újezdský