2017-10-19 37 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在这种情况下类似的,如果需要你可以为其他服务做的

相关问题