使用github操作部署ecs服务和两个容器



我有一个dotnet webapi和nginx跨两个容器定义,这两个容器都被一个任务定义用于提供一个服务。它在ECS和Docker Desktop中都可以正常工作。

我的问题是如何部署它使用github的行动。我有很多其他的单容器dotnet服务,这些服务工作良好,我使用github操作部署。操作yml文件的相关部分如下所示:

- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ env.ECS_TASK_NAME }} 
run: |
# Build a docker container and
# push it to ECR so that it can
# be deployed to ECS.
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
- name: Fill in the new image ID in the Amazon ECS task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ env.ECS_TASK_DEFINITION }}
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.build-image.outputs.image }}

这一切都工作得很好——构建、填充任务定义和部署。我在github文档中读到,我可以简单地重复amazon-ecs-render-task-definition部分来添加第二个容器,就像这样…

- name: Fill in the new dotnet image ID in the Amazon ECS task definition
id: task-def-dotnet
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ env.ECS_TASK_DEFINITION }}
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.build-image.outputs.image }} #              <-- what goes here?
- name: Fill in the new nginx image ID in the Amazon ECS task definition
id: task-def-nginx
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ env.ECS_TASK_DEFINITION }}
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.build-image.outputs.image }} #              <-- what goes here?

我无法解决的是如何在build-image步骤中运行docker compose命令,以便我可以创建和捕获两个输出图像文件,然后在${{ steps.build-image.outputs.image }}参数所在的正确位置将它们输入。

我很确定我可以代替…

docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .

…比如…

docker compose -p ${{ env.ECS_TASK_NAME }} create

…但无法找到如何识别多个输出或稍后指定它们。

任何帮助都将非常感激。

所以我最终发现我可以在脚本中使用与docker Desktop相同的docker compose命令,并捕获由它生成的两个图像。

然后我发现了如何将amazon-ecs-render-task-definition的多个调用链接在一起并访问它们的输出以进行下一步,如下所示....

- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ env.ECS_TASK_NAME }} 
IMAGE_DOTNET: ${{ env.IMAGE_NAME_DOTNET }} 
IMAGE_NGINX: ${{ env.IMAGE_NAME_NGINX }} 
run: |
docker compose -p $IMAGE_TAG create
docker tag $IMAGE_DOTNET:latest $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_DOTNET
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_DOTNET
echo "imagedotnet=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_DOTNET" >> $GITHUB_OUTPUT
docker tag $IMAGE_NGINX:latest $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_NGINX
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_NGINX
echo "imagenginx=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_NGINX" >> $GITHUB_OUTPUT
- name: Fill in the new dotnet image ID in the Amazon ECS task definition
id: task-def-dotnet
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ env.ECS_TASK_DEFINITION }}
container-name: ${{ env.CONTAINER_NAME_DOTNET }}
image: ${{ steps.build-image.outputs.imagedotnet }}
- name: Fill in the new nginx image ID in the Amazon ECS task definition
id: task-def-nginx
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ steps.task-def-dotnet.outputs.task-definition }}
container-name: ${{ env.CONTAINER_NAME_NGINX }}
image: ${{ steps.build-image.outputs.imagenginx }}

您没有分享任何关于您的nginx容器/图像的信息。

您需要构建nginxdot-net映像相同。然后,您需要用nginx图像渲染task-definition,并在最后一步将最新生成的task-definition部署到您的集群。

- name: Build, tag, and push image to Amazon ECR
id: build-images
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ env.ECS_TASK_NAME }} 
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "dotnet_image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT

docker build -f Dockerfile.nginx -t $ECR_REGISTRY/$ECR_NGINX_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_NGINX_REPOSITORY:$IMAGE_TAG
echo "nginx_image=$ECR_REGISTRY/$ECR_NGINX_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
- name: Fill in the new dotnet image ID in the Amazon ECS task definition
id: task-def-dotnet
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ env.ECS_TASK_DEFINITION }}
container-name: ${{ env.DOTNET_CONTAINER_NAME }}
image: ${{ steps.build-images.outputs.dotnet_image }}
- name: Fill in the new nginx image ID in the Amazon ECS task definition
id: task-def-nginx
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ steps.task-def-dotnet.outputs.task-definition }}
container-name: ${{ env.NGINX_CONTAINER_NAME }}
image: ${{ steps.build-images.outputs.nginx_image }}
- name: Deploy to Amazon ECS service
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: ${{ steps.task-def-nginx.outputs.task-definition }}
service: ${{ env.ECS_SERVICE }}
cluster: ${{ env.ECS_CLUSTER }}

最新更新