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
运行它。
现在我必须手动更改文件才能改变环境,这当然是错误的做法。
我认为应该有办法避免这些手动更改。我该怎么做?
答案 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.yml
和docker-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
,在这种情况下,您可以根据需要为其他服务执行此操作