适用于不同环境的Dockerfile和docker-compose.yaml

时间:2017-10-19 07:14:32

标签: docker docker-compose dockerfile

docker-compose for prod:

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

prod的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

COPY . /www

WORKDIR /www

ENV PORT 8080

EXPOSE  8080

CMD ["npm", "start"]

docker-compose for dev:

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运行它。

现在我必须手动更改文件才能改变环境,这当然是错误的做法。

我认为应该有办法避免这些手动更改。我该怎么做?

3 个答案:

答案 0 :(得分:1)

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

在您的代码中,您可以通过指定process.env.NODE_ENV

来获取这些值

答案 1 :(得分: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公开了不同端口的相同docker-compose.yml文件,将env_file公开到production.env并将命令设置为/bin/ash -c "npm start"将有助于运行生产服务器。

    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

分别用于开发和生产系统。

答案 2 :(得分:0)

您可以将环境变量用作 例如 在本地计算机终端中将env设置为export env="prod" 并在docker-compose文件中 image: container_image_${env} or image: container_image:${env} 将创建图像为container_image_prod or container_image:prod

您还可以将db的服务名称设置为db_${env},以便根据环境获取服务名称db_prod,在这种情况下,您可以根据需要为其他服务执行此操作