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

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 

Docker文件的开发

 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

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

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

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

在您的代码中,您可以通过指定process.env.NODE_ENV来获取这些值

Dockerfile应该包含用于创build图像的命令。 当使用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 

这将创build你的形象。

关于你的docker-compose.yml文件,为生产和开发使用两个单独的docker-compose文件。 使用env文件分离开发和生产variables。 您可以在存储库中检查开发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" 

这将运行您的开发服务器。

同样的,一个docker-compose.yml文件在不同的端口暴露在生产-443:443你的情况下,env_file production.env .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" 

如果您在同一台机器上运行开发服务器和生产服务器(从不build议),则可以分别为开发和生产系统创build两个名为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

分别为开发和生产系统。

你可以使用环境variables,例如在本地机器terminal和docker-compose-file image: container_image_${env} or image: container_image:${env}设置env为export env="prod" image: container_image_${env} or image: container_image:${env}将创build映像为container_image_prod or container_image:prod

您还可以将db的服务名称设置为db_${env}以便根据环境获取服务名称,如本例中的db_prod类似地,如果需要,可以对其他服务执行