Dockerfile和搬运工-compose.yaml针对不同的环境
搬运工-构成为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
。
现在我必须手动对文件进行更改才能更改环境,这当然是错误的做法。
我认为应该有办法避免这些手动更改。我怎么做?
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.yml
和docker-compose-production.yml
两个文件在同一台机器开发服务器和生产服务器(从不建议),然后您可以通过使用运行服务器命令:
sudo docker-compose -f docker-compose-development.yml up
sudo docker-compose -f docker-compose-production.yml up
进行开发和生产系统相对于结构延续。
您可以在docker-compose.yml
文件的services
部分指定环境。 例子: services: environment: NODE_ENV: "development"
APP_PORT: 5000 DB_URI: "<DB URI>"
并在代码中,你可以通过指定process.env.NODE_ENV
您可以在您使用环境变量 例如 集ENV作为export env="prod"
把这些值本地计算机终端 和docker-撰写文件 image: container_image_${env} or image: container_image:${env}
将创建图像作为container_image_prod or container_image:prod
您还可以设置为DB为服务名称这样你就可以根据环境得到服务名称db_prod
在这种情况下类似的,如果需要你可以为其他服务做的