2017-10-19 57 views
0

搬運工-構成爲PROD:Dockerfile和搬運工-compose.yaml針對不同的環境

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

Dockerfile爲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"] 

搬運工-構成用於開發:

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

dev的Dockerfile

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"] 

我正在運行它docker-compose up

現在我必須手動對文件進行更改才能更改環境,這當然是錯誤的做法。

我認爲應該有辦法避免這些手動更改。我怎麼做?

回答

0

Dockerfile應包含用於創建圖像的命令。使用docker-compose api-server服務時,該映像將根據需要運行服務器。

對於例如,你的情況:

你Dockerfile應該是這個樣子。

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 

這將創建您的圖像。

關於您的docker-compose.yml文件,爲生產和開發使用兩個單獨的docker-compose文件。使用env文件分離開發和生產變量。您可以在存儲庫中檢入開發docker-compose.yml和development env文件,生產docker-compose和環境文件將特定於您的生產服務器。

你的樣品docker-compose.yml文件應該是這個樣子

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" 

這將運行你的開發服務器。

同樣暴露在你的情況下,生產-443:443和env_file到production.env和命令集來/bin/ash -c "npm start"不同端口的相同泊塢窗,compose.yml文件將幫助您運行生產服務器。

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" 

如果你正在運行中,你可以創建一個名爲分別開發和生產系統docker-compose-development.ymldocker-compose-production.yml兩個文件在同一臺機器開發服務器和生產服務器(從不建議),然後您可以通過使用運行服務器命令:

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

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

進行開發和生產系統相對於結構延續。

1

您可以在docker-compose.yml文件的services部分指定環境。 例子: services: environment: NODE_ENV: "development"
APP_PORT: 5000 DB_URI: "<DB URI>"

並在代碼中,你可以通過指定process.env.NODE_ENV

0

您可以在您使用環境變量 例如 集ENV作爲export env="prod"把這些值本地計算機終端 和docker-撰寫文件 image: container_image_${env} or image: container_image:${env} 將創建圖像作爲container_image_prod or container_image:prod

您還可以設置爲DB爲服務名稱這樣你就可以根據環境得到服務名稱db_prod在這種情況下類似的,如果需要你可以爲其他服務做的

相關問題