2017-10-19 2 views
0

Docker-komponieren für prod:Dockerfile und Docker-compose.yaml für verschiedene Umgebungen

version: '2' 
services: 
    db: 
    image: mongo:3 
    ports: 
     - "27017:27017" 
    api-server: 
    build: . 
    ports: 
     - "443:443" 
    links: 
     - db 
    volumes: 
     - /www/node_modules 

Dockerfile für prod:

FROM alpine:3.4 

LABEL authors="John Doe" 

RUN apk add --update nodejs bash git 

COPY package.json /www/package.json 
RUN cd /www; apk --no-cache add --virtual builds-deps build-base python && npm install && npm rebuild bcrypt --build-from-source && apk del builds-deps 

COPY . /www 

WORKDIR /www 

ENV PORT 8080 

EXPOSE 8080 

CMD ["npm", "start"] 

Docker-komponieren für Entwickler:

version: '2' 
services: 
    db: 
    image: mongo:3 
    ports: 
     - "27017:27017" 
    api-server: 
    build: . 
    ports: 
     - "8080:8080" 
    links: 
     - db 
    volumes: 
     - .:/www 
     - /www/node_modules 

Dockerfile für Entwickler

FROM alpine:3.4 

LABEL authors="John Doe" 

RUN apk add --update nodejs bash git 

COPY package.json /www/package.json 
RUN cd /www; apk --no-cache add --virtual builds-deps build-base python && npm install && npm rebuild bcrypt --build-from-source && apk del builds-deps 

WORKDIR /www 

ENV PORT 8080 

EXPOSE 8080 

CMD ["npm", "run", "dev"] 

Ich führe es mit docker-compose up.

Jetzt muss ich manuell Änderungen an Dateien vornehmen, um die Umgebung zu ändern, was natürlich ein falscher Weg ist.

Ich nehme an, es sollte einen Weg geben, diese manuellen Änderungen zu vermeiden. Wie mache ich das?

Antwort

0

Dockerfile sollte die Befehle zum Erstellen des Abbilds enthalten. Dieses Bild, wenn es mit docker-compose api-server Dienst von Ihnen verwendet wird, wird den Server wie erforderlich ausführen.

Für zB in Ihrem Fall.

Ihre Dockerfile sollte in etwa so aussehen.

FROM alpine:3.4 

LABEL authors="John Doe" 

RUN apk add --update nodejs bash git 

RUN mkdir /www 

WORKDIR /www 

ADD package.json /www/package.json 

RUN apk --no-cache add --virtual builds-deps build-base python && npm install && npm rebuild bcrypt --build-from-source && apk del builds-deps 

Dies wird Ihr Bild erstellen.

Verwenden Sie für Ihre docker-compose.yml-Datei zwei separate docker-compose-Dateien für die Produktion und Entwicklung. Verwenden Sie env-Dateien, um Entwicklungs- und Produktionsvariablen voneinander zu trennen. Sie können die Entwicklungsdatei docker-compose.yml und die env-Entwicklungsdatei in Ihrem Repository einchecken. docker-compose- und environment-Dateien für die Produktion werden für Ihren Produktionsserver spezifisch sein.

Ihre Probe docker-compose.yml Datei sollte so etwas wie dies

version: '2' 
services: 
    db: 
    image: mongo:3 
    ports: 
     - "27017:27017" 
    api-server: 
    build: 
     context: . 
     dockerfile: Dockerfile 
    ports: 
     - "8080:8080" 
    links: 
     - db 
    env_file: 
     development.env 
    volumes: 
     - ./:/www 
     - /www/node_modules # I really don't understand this statement 
    command: > 
     /bin/ash -c "npm run dev" 

aussieht Dies wird Ihren Entwicklungsserver ausgeführt werden.

Ebenso wird eine gleiche Docker-compose.yml Datei mit verschiedenen Anschlüssen für die Produktion ausgesetzt -443:443 in Ihrem Fall und env_file zu production.env und /bin/ash -c "npm start"-Befehlssatz wird helfen, Ihre Produktionsserver ausgeführt werden.

version: '2' 
    services: 
     db: 
     image: mongo:3 
     ports: 
      - "27017:27017" 
     api-server: 
     build: 
      context: . 
      dockerfile: Dockerfile 
     ports: 
      - "443:443" 
     links: 
      - db 
     env_file: 
      production.env 
     volumes: 
      - ./:/www 
      - /www/node_modules # I really don't understand this statement 
     command: > 
      /bin/ash -c "npm start" 

Falls Sie laufen den Entwicklungsserver und Produktionsserver (nie ratsam) in der gleichen Maschine, die Sie zwei Dateien docker-compose-development.yml und docker-compose-production.yml für Entwicklung und Produktionssysteme genannt schaffen können jeweils und dann können Sie den Server ausführen, indem Sie der Befehl:

sudo docker-compose -f docker-compose-development.yml up

sudo docker-compose -f docker-compose-production.yml up

Entwicklungs- und Produktionssystem bezüglich ively.

1

Sie können die Umgebung im services-Teil der Datei docker-compose.yml angeben. Beispiel: services: environment: NODE_ENV: "development"
APP_PORT: 5000 DB_URI: "<DB URI>"

Und in Ihrem Code, können Sie diese Werte durch Angabe nehmen process.env.NODE_ENV

0

Sie Umgebungsvariablen wie zum Beispiel Satz env als export env="prod" in Ihnen lokalen Maschinenterminal und in docker- verwenden können komponieren-Datei image: container_image_${env} or image: container_image:${env} wird erstellen Bilder als container_image_prod or container_image:prod

können Sie auch den Service-Namen für db alsgesetzt, so dass Sie den Service-Namen entsprechend der Umgebung als db_prod erhalten. In diesem Fall können Sie bei Bedarf auch andere Dienste ausführen.

Verwandte Themen