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.yml
和docker-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
类似地,如果需要,可以对其他服务执行