我一直在寻找以下问题的答案。过去一周,我开始在docker上进行研究和POC,所以我不了解任何最佳实践或工作流程。但是这里有我的用例和我一直在努力的事情。
我将查询添加到blockquote中,以便于浏览。
我和我的团队目前为Development
阶段,UAT
阶段和Production
阶段进行了设置(不使用Docker)。
我用docker-compose
来按需要设置环境。
我有这样的文件夹结构:
deploy
|-----.env
|-----docker-compose-dev.yaml
|-----docker-compose-prod.yaml
|-----docker-compose-uat.yaml
src
|-----Dockerfile
我认为这是正确的方法。每个阶段/环境都有
docker-compose
个文件。我说的对吗?在.gitignore和.dockerignore中应该忽略
Dockerfile
吗?
在这里,我的模板是docker-compose-dev.yaml
#filename - docker-compose-dev.yaml
version: "3"
services:
dev:
container_name: ${DEV_DOCKER_CONTAINER_NAME}
restart: ${DEV_DOCKER_RESTART_SERVER}
build:
context: ${DEV_DOCKER_BUILD_FOLDER}
args:
PORT: ${DEV_DOCKER_PORT}
ports:
- "${DEV_DOCKER_PORT}:${DEV_NODE_SERVER_PORT}"
environment:
- MYSQL_HOST=${DEV_MYSQL_HOST}
- MYSQL_USERNAME=${DEV_MYSQL_USERNAME}
- MYSQL_PASSWORD=${DEV_MYSQL_PASSWORD}
- MYSQL_DBNAME=${DEV_MYSQL_DBNAME}
- MYSQL_PORT=${DEV_MYSQL_PORT}
- PORT=${DEV_NODE_SERVER_PORT}
#filename - docker-compose-prod.yaml
version: "3"
services:
prod:
container_name: ${PROD_DOCKER_CONTAINER_NAME}
restart: ${PROD_DOCKER_RESTART_SERVER}
build:
context: ${PROD_DOCKER_BUILD_FOLDER}
args:
PORT: ${PROD_DOCKER_PORT}
ports:
- "${PROD_DOCKER_PORT}:${PROD_NODE_SERVER_PORT}"
environment:
- MYSQL_HOST=${PROD_MYSQL_HOST}
- MYSQL_USERNAME=${PROD_MYSQL_USERNAME}
- MYSQL_PASSWORD=${PROD_MYSQL_PASSWORD}
- MYSQL_DBNAME=${PROD_MYSQL_DBNAME}
- MYSQL_PORT=${PROD_MYSQL_PORT}
- PORT=${PROD_NODE_SERVER_PORT}
我试图使所有内容都可自定义,以使所有内容都由.env
文件控制。
我的第一个想法是创建.env.prod
,.env.uat
,.env.dev
。但是我不确定如何强制docker-compose
使用自定义环境文件。我cannot use
是那个标签env_file
,因为我有docker-compose
文件本身的变量。
- 我应如何在docker-compose中强制使用自定义
.env.<>
?
我首先想到的是,如果阶段的代码相同,则应该有1张图片和多个容器container1-uat
,container2-dev
。但是,我想,只有一个图像可以分为三个阶段是没有意义的。困惑...
我尝试使用
docker-compose -f docker-compose-dev.yaml -f docker-compose-prod.yaml up
创建具有1个图像Same Dockerfile
的2个容器。但是它仍然创建了2张图片。可以在docker-compose
中完成吗?例如,image-1
将container-app-dev
container-app-prod
创建为2个容器。如果代码相同,我应该为所有3个阶段创建1个图像还是为3个阶段创建3个图像?
总体而言,我在生产阶段和开发阶段的设置是否正确?