web-dev-qa-db-fra.com

Comment puis-je passer un argument avec docker-composer jusqu'à

J'ai un fichier docker-compose.yml et dans le terminal, je suis typing docker-compose up [something], mais j'aimerais également passer un argument à docker-compose.yml. Est-ce possible? J'ai lu sur les variables d'interpolation et essayé de spécifier une variable dans le fichier .yml à l'aide de ${testval}, puis de docker-compose up [something] var="test", mais le message d'erreur suivant s'affiche:

AVERTISSEMENT: La variable testval n'est pas définie. Par défaut, une chaîne vide.
ERREUR: Aucun service de ce type: testval=test

12
BubbleTea

Sur la base de dnephin answer , j’ai créé ce exemple de dépôt dans lequel vous pouvez passer une variable pour une composition fixe.

L'utilisation est simple:

  • TEST= docker-compose up pour créer et démarrer les conteneurs app et db. L'API devrait alors être en cours d'exécution sur votre démon docker sur le port 3030. 
  • TEST=DO docker-compose up pour créer et démarrer les conteneurs app et db. L'API doit exécuter le npm run test à l'intérieur du fichier package.json
  • $env:TEST="";docker-compose up pour créer et démarrer les conteneurs app et db. L'API devrait alors être en cours d'exécution sur votre démon docker sur le port 3030. 
  • $env:TEST="do";docker-compose up pour créer et démarrer les conteneurs app et db. L'API doit exécuter le npm run test à l'intérieur du fichier package.json
11
Rafael Delboni

Vous devez passer les variables en tant que variables d'environnement:

testvar=test docker-compose up ...

ou 

export testvar=test
docker-compose up
8
dnephin

Je ne suis pas sûr de ce que vous voulez faire ici, mais si vous avez besoin de passer une variable d'environnement à un conteneur spécifique, docker-compose.yml vous permet de le faire:

web:
  ...
  environment:
    - Rails_ENV=production
    - VIRTUAL_Host=www.example.com
    - VIRTUAL_PORT=3011

Ces variables seront spécifiques au conteneur dans lequel vous les avez spécifiées et ne seront pas partagées entre les conteneurs.

De plus, "docker-compos up" ne prend aucun argument.

3
TopperH

docker-compose n'incluez pas d'indicateur ni de commande pour passer des arguments.

Compose est avant tout un outil permettant d’exécuter des services et non de créer des images .Essayez d’utiliser la variable ARG définie dans chaque fichier docker comme argument.

Il ne sera pas possible de prendre en charge chaque scénario de génération unique car docker-compose n'est pas conçu à cet effet. vous ne pouvez réellement supporter que les scénarios de construction les plus courants.

Vous pouvez voir plus d'informations sur son sujet ici .

2
Hemerson Varela

Vous pouvez utiliser docker-compose build --build-arg app_env=production pour construire une image. Ensuite, vous pouvez utiliser docker-compose up. Cela va attacher à l'image construite.

# docker-compose.yml    
services:
      service_name:
        build:
          context: .
          args:
          - app_env=development
....


# Dockerfile
...
ARG app_env
ENV RACK_ENV $app_env
RUN if [ ${APP_ENV} = production ]; run command; else run another command; fi
...

Puis tapez suivant à la ligne de commande

docker-compose build --build-arg app_env=production
docker-compose up
1
Alex P