使用 docker-compose 构建开发和部署管道
Using docker-compose to build development and deployment pipeline
我正在尝试创建一个 Docker Compose 文件来为 ReactJS 项目构建我的本地开发和部署管道。
一些上下文:在本地我在 3000
端口上启动服务器。对于部署,我导出静态工件,将其部署在 S3 上并使我的 CloudFront 文件失效。
我构建了一个包含节点和 AWS CLI 的 Docker Image,我将其用作我的基础 FROM
图片。
Docker文件
FROM a6kme/node-aws-cli:v1
WORKDIR /app
COPY package*.json /app/
RUN npm install
EXPOSE 3000
docker-compose.yml
version: '3'
volumes:
esnextwebjourney_node_modules:
services:
esnextwebjourney:
build: .
volumes:
- .:/app
- esnextwebjourney_node_modules:/app/node_modules
ports:
- 3000:3000
command: >
sh -c "npm run build && npm run start"
有效,但每次我必须继续并更新命令以启动服务器 npm run build && npm run start
或将其部署在 s3 和 CloudFront 上,即 npm run build && npm run export && npm run deploy
。
我的问题是-
我可以创建一个如下所示的 docker-compose.yml 文件,然后我可以调用 docker-compose run start --build
或 docker-compose run deploy --build
,这将满足我的两个目的。
version: '3'
volumes:
esnextwebjourney_node_modules:
services:
build:
build: .
volumes:
- .:/app
- esnextwebjourney_node_modules:/app/node_modules
command: npm run build
start:
depends_on:
- build
command: npm run start
ports:
- 3000:3000
export:
depends_on:
- build
command: npm run export
deploy:
depends_on:
- export
command: npm run deploy
您可以创建覆盖:
docker-compose.override.yml:
version: '3'
services:
esnextwebjourney:
command: "npm run build && npm run export && npm run deploy"
当你想导出时你可以运行: docker-compose up -d --build
当你只想部署时:docker-compose -f docker-compose.yml up -d --build
第二个版本忽略覆盖。
另一种解决方案是为命令使用环境变量。这样,您的 docker-compose.yml 始终保持不变,您只需要在 运行 之前导出一个新的环境变量。您可以使用 shell 脚本将其自动化。
如果您创建一个命名卷并在所有服务之间共享,您想要构建的内容也可能会起作用。但我更喜欢我的解决方案:)
希望这对你有用。
我正在尝试创建一个 Docker Compose 文件来为 ReactJS 项目构建我的本地开发和部署管道。
一些上下文:在本地我在 3000
端口上启动服务器。对于部署,我导出静态工件,将其部署在 S3 上并使我的 CloudFront 文件失效。
我构建了一个包含节点和 AWS CLI 的 Docker Image,我将其用作我的基础 FROM
图片。
Docker文件
FROM a6kme/node-aws-cli:v1
WORKDIR /app
COPY package*.json /app/
RUN npm install
EXPOSE 3000
docker-compose.yml
version: '3'
volumes:
esnextwebjourney_node_modules:
services:
esnextwebjourney:
build: .
volumes:
- .:/app
- esnextwebjourney_node_modules:/app/node_modules
ports:
- 3000:3000
command: >
sh -c "npm run build && npm run start"
有效,但每次我必须继续并更新命令以启动服务器 npm run build && npm run start
或将其部署在 s3 和 CloudFront 上,即 npm run build && npm run export && npm run deploy
。
我的问题是-
我可以创建一个如下所示的 docker-compose.yml 文件,然后我可以调用 docker-compose run start --build
或 docker-compose run deploy --build
,这将满足我的两个目的。
version: '3'
volumes:
esnextwebjourney_node_modules:
services:
build:
build: .
volumes:
- .:/app
- esnextwebjourney_node_modules:/app/node_modules
command: npm run build
start:
depends_on:
- build
command: npm run start
ports:
- 3000:3000
export:
depends_on:
- build
command: npm run export
deploy:
depends_on:
- export
command: npm run deploy
您可以创建覆盖:
docker-compose.override.yml:
version: '3'
services:
esnextwebjourney:
command: "npm run build && npm run export && npm run deploy"
当你想导出时你可以运行: docker-compose up -d --build 当你只想部署时:docker-compose -f docker-compose.yml up -d --build
第二个版本忽略覆盖。
另一种解决方案是为命令使用环境变量。这样,您的 docker-compose.yml 始终保持不变,您只需要在 运行 之前导出一个新的环境变量。您可以使用 shell 脚本将其自动化。
如果您创建一个命名卷并在所有服务之间共享,您想要构建的内容也可能会起作用。但我更喜欢我的解决方案:)
希望这对你有用。