2017-11-14 4 views
0

Ich versuche, einen Dienst, der aus einem Webserver und einer Datenbank besteht, alle in Dockercontainern zu erstellen. Momentan versuche ich, dieselbe Umgebungsdatei für beide zu erstellen, die Datenbankberechtigungsnachweise enthalten würde. Leider, wenn ich versuche, eine Datenbank damit zu erstellen, stellt sich heraus, dass sie leer sind. Wie kann ich ein Projekt mit einer einzelnen Umgebungsdatei für beide Komponenten erstellen? Hier ist meine Docker-compose.yml:Übergeben Sie die Umgebungsvariable an dockerfile build

version: '2' 

services: 
    db: 
    build: 
     context: . 
     dockerfile: Dockerfile-db 
    ports: 
     - '5433:5432' 
    env_file: 
     - env 
    web: 
    build: . 
    ports: 
     - '8000:8000' 
    command: venv/bin/python manage.py runserver 0.0.0.0:8000 
    depends_on: 
     - db 
    env_file: 
     - env 

Hier ist ein Teil meiner Dockerfile-db-Datei verantwortlich für die Erstellung der Datenbank:

FROM ubuntu:16.04 

RUN apt-get update && apt-get install -y postgresql-9.5-postgis-2.2 

USER postgres 

ARG DB_PASSWORD 
ARG DB_NAME 

RUN echo $DB_PASSWORD 

RUN /etc/init.d/postgresql start && \ 
    psql --command "ALTER USER postgres WITH PASSWORD '$DB_PASSWORD';" && \ 
    psql --command "CREATE DATABASE $DB_NAME;" && \ 
    psql --command "\\c $DB_NAME" && \ 
    psql --command "CREATE EXTENSION postgis;" && \ 
    psql --command "CREATE EXTENSION postgis_topology;" 

Und meine env-Datei hat folgende Struktur:

DB_NAME=some_name 
DB_USER=postgres 
DB_PASSWORD=some_password 
DB_HOST=db 
DB_PORT=5432 

Antwort

1

Die Umgebungsdatei ist nicht Teil des Erstellungsprozesses, sie wird beim Ausführen des Containers verwendet.

Sie müssen Build-Args verwenden. In Docker-Compose können Sie args in der Datei angeben bauen:

build: 
    context: . 
    dockerfile: Dockerfile-db 
    args: 
    DB_NAME: some_name 
    DB_USER: postgress 
    ... 

Dies könnte nicht eine gute Idee, wenn Sie die composefile veröffentlichen möchten, wie Sie die Anmeldeinformationen darin sind zu speichern. Sie können explizit bauen und --build-arg

docker-compose build --build-arg DB_NAME= some_name ... 

passieren Und wenn in docker-compose run --no-build

-Update gibt keine Build ausgeführt wird:

Wie @gonczor vorgeschlagen, eine kürzere und saubere Syntax zu verwenden, um das env übergibt Datei als Build args ist:

docker-compose build --build-args $(cat envfile) 
+0

Ich bekomme diese Nachricht, als ob die '--build-arg' war n unterstützt. Kann es wegen 'docker-compose' Version sein? (Ich bin mit 1.8) Verbrauch: bauen [Optionen] [SERVICE ...] Optionen: --force-rm Immer Zwischenbehälter entfernen. --no-cache Verwenden Sie beim Erstellen des Images keinen Cache. --pull Immer versuchen, eine neuere Version des Bildes zu ziehen. – gonczor

+0

Ja möglicherweise. Wenn "docker-compose build --help" nicht die Option "--build-arg" anzeigt, müssen Sie docker compose aktualisieren – yamenk

+0

Vielen Dank für Ihre Hilfe. Es funktionierte. Und ich habe mir einen Workaround ausgedacht. Ich habe gerade '--build-args $ (cat env)' zum Befehl hinzugefügt. Wenn Sie so freundlich wären, es der Antwort hinzuzufügen, wäre ich dankbar. – gonczor

Verwandte Themen