-1

Je souhaite passer des variables d'environnement aux applications conteneurisées dans Docker via docker-composer. Ceci est une solution VS 2017 15.3 Tools for Docker.Passage des variables d'environnement à l'application dans un conteneur Docker via docker-composer

Dans mon fichier docker.compose.yml Je:

app.web: 
    image: app.web 
    env_file: 
     - ./path.to.project/config.env 
    build: 
     context: ./path.to.project 
     dockerfile: Dockerfile 

Dans config.env Je:

TEST=Compose 

Mais quand j'essaie de lire les variables à l'aide Environment.GetEnvironmentVariable("TEST"); Je reçois toujours nul.

Si je définis un fichier inexistant dans env_file il se plaint lorsque je l'exécute, donc je donne pour acquis que trouve le fichier.

Si je mets la variable ainsi:

app.web: 
    image: app.web 
    environment: 
     - TEST=ComposeLiteral 
    build: 
     context: ./path.to.project 
     dockerfile: Dockerfile 

je reçois "ComposeLiteral" lors de l'évaluation "TEST".

Quelle est la manière correcte de transmettre un fichier avec des variables d'environnement à l'application?

+0

Vous essayez d'obtenir cette variable lors de la construction de votre image ou lors de l'exécution? – lifeisfoo

+0

Pendant l'exécution. L'idée est de permettre à l'application conteneurisée de lire ces valeurs. – vtortola

+0

Linux. Il utilise .NET Core 2.0 – vtortola

Répondre

0

Le problème est que le fichier config.env que j'utilisais commençait par le UTF8 BOM, ce qui faisait que les éditeurs de texte me montraient le même contenu, mais que le docker compose lisait autre chose.

Lorsque vous ajoutez un fichier texte via Visual Studio, la nomenclature est ajoutée. J'ai créé un example project with the problem.

enter image description here

Ensuite, dans le journal est possible de voir comment la mauvaise analyse syntaxique se produit:

config.env:

environment: 
    NUGET_FALLBACK_PACKAGES: /root/.nuget/fallbackpackages 
    "\uFEFFTEST": Compose 

config2.env

environment: 
    NUGET_FALLBACK_PACKAGES: /root/.nuget/fallbackpackages 
    TEST: Compose 

https://github.com/docker/compose/issues/5220

0

Je ne parviens pas à reproduire votre problème. Si je commence avec votre Dockerfile:

version: "2" 

services: 
    app.web: 
    image: app.web 
    env_file: 
     - ./path.to.project/config.env 
    build: 
     context: ./path.to.project 
     dockerfile: Dockerfile 

Et path.to.project J'utilise le Dockerfile suivant:

FROM alpine 
RUN apk add --update python3 
COPY dumpenv.py /dumpenv.py 
CMD python3 /dumpenv.py 

qui exécute un simple serveur web qui ne fait que des variables d'environnement de vidage:

import http.server 
import os 


class Handler(http.server.BaseHTTPRequestHandler): 
    def do_GET(self): 
     self.send_response(200) 
     self.send_header('Content-type', 'text/plain') 
     self.end_headers() 

     content = [] 

     for k, v in os.environ.items(): 
      content.append('{:20} {}'.format(k, v)) 

     self.wfile.write(bytes('\n'.join(content), 'utf-8')) 
     return 


server = http.server.HTTPServer(('0.0.0.0', 8080), Handler) 
server.serve_forever() 

Si je docker-compose up cet environnement, puis se connecter au service, je vois:

PWD    /
TEST     ComposeLiteral 
HOSTNAME    5388e6e2717a 
SHLVL    1 
HOME     /root 
PATH     ... 

Vous pouvez trouver cet exemple complet en ligne here. Si vous voyez un comportement différent en utilisant ce même exemple, pourriez-vous mettre à jour votre question pour inclure un reproducteur complet?

+0

N'existe-t-il pas un moyen qui n'implique pas l'exécution de scripts ad-hoc? Il semble que par la documentation cela devrait être possible. – vtortola

+0

Je ne vous suis pas. Il n'y a pas de scripts ad-hoc ici. Il y a juste une variable d'environnement passée avec succès au Docker 'CMD'. – larsks

+0

Mes excuses, vous avez raison. J'ai rapidement lu votre message sur mon mobile et je l'ai mal compris. Votre code fonctionne bien, et c'est exactement ce que j'essayais de faire moi-même. Cependant, le problème est que mon config.env commence avec la nomenclature UTF8. Merci beaucoup d'avoir pris le temps de faire un exemple. – vtortola