Python和Docker实现AWS ECR/ECS上全自动容器化部署网站前端

以类似ChatGPT的网站前端界面的HTML页面、CSS样式表和JavaScript脚本为例,用Python代码将整个前端代码文件的目录,其中包括所有创建的前端代码文件用Docker打包成镜像文件,提前检查Docker软件是否已经安装,并如果容器服务不存在,则在Amazon ECR中注册容器服务,在Amazon ECS中上传对应的镜像文件并启动运行和返回运行状态,程序需要异常处理和日志文件记录每一次运行的参数和结果,所有运行所需的参数都存储在ini配置文件中。

这个解决方案提供了完整的CI/CD流水线基础框架,可以根据实际需求扩展自动化测试、蓝绿部署等高级功能。分步解决方案包含前端代码和部署脚本。以下是完整的实现:

  1. 前端代码文件结构:
chatgpt-frontend/
├── static/
│   ├── css/
│   │   └── style.css
│   └── js/
│       └── script.js
├── templates/
│   └── index.html
├── Dockerfile
├── requirements.txt
├── deploy.py
└── config.ini
  1. 前端代码文件内容:

static/css/style.css:

.chat-container {max-width: 800px;margin: 0 auto;padding: 20px;background-color: #f5f5f5;border-radius: 10px;height: 80vh;display: flex;flex-direction: column;
}.chat-messages {flex: 1;overflow-y: auto;padding: 10px;background-color: white;border-radius: 5px;margin-bottom: 10px;
}.message {margin: 10px 0;padding: 10px;border-radius: 5px;max-width: 70%;
}.user-message {background-color: #e3f2fd;margin-left: auto;
}.bot-message {background-color: #f5f5f5;
}.input-container {display: flex;gap: 10px;
}input[type="text"] {flex: 1;padding: 10px;border: 1px solid #ddd;border-radius: 5px;
}button {padding: 10px 20px;background-color: #007bff;color: white;border: none;border-radius: 5px;cursor: pointer;
}button:hover {background-color: #0056b3;
}

templates/index.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ChatGPT Clone</title><link rel="stylesheet" href="/static/css/style.css">
</head>
<body><div class="chat-container"><div class="chat-messages" id="chat-messages"><div class="message bot-message">Hello! How can I help you today?</div></div><div class="input-container"><input type="text" id="user-input" placeholder="Type your message..."><button onclick="sendMessage()">Send</button></div></div><script src="/static/js/script.js"></script>
</body>
</html>

static/js/script.js:

function appendMessage(message, isUser) {const chatMessages = document.getElementById('chat-messages');const messageDiv = document.createElement('div');messageDiv.className = `message ${isUser ? 'user-message' : 'bot-message'}`;messageDiv.textContent = message;chatMessages.appendChild(messageDiv);chatMessages.scrollTop = chatMessages.scrollHeight;
}async function sendMessage() {const userInput = document.getElementById('user-input');const message = userInput.value.trim();if (message) {appendMessage(message, true);userInput.value = '';try {const response = await fetch('/api/chat', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ message })});const data = await response.json();appendMessage(data.reply, false);} catch (error) {appendMessage('Error connecting to the server', false);}}
}

Dockerfile:

FROM nginx:alpine
COPY ./static /usr/share/nginx/html/static
COPY ./templates /usr/share/nginx/html/templates
COPY ./templates/index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

requirements.txt:

boto3==1.34.28
configparser==5.3.0
docker==6.1.3

config.ini:

[aws]
region = us-west-2
ecr_repository = chatgpt-frontend
ecs_cluster = ecs-cluster
ecs_service = chatgpt-frontend-service
task_definition = chatgpt-frontend-task[deployment]
image_name = chatgpt-frontend
image_tag = latest
port = 80

deploy.py:

import os
import subprocess
import configparser
import logging
import boto3
from docker import from_env
from docker.errors import DockerException
from botocore.exceptions import ClientError, NoCredentialsError# Configure logging
logging.basicConfig(filename='deployment.log',level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s'
)class DeploymentError(Exception):passclass AWSClients:def __init__(self, region):self.ecr = boto3.client('ecr', region_name=region)self.ecs = boto3.client('ecs', region_name=region)def load_config():config = configparser.ConfigParser()if not config.read('config.ini'):raise DeploymentError("Configuration file config.ini not found")return configdef check_docker():try:docker_client = from_env()docker_client.ping()logging.info("Docker is running")except DockerException:logging.error("Docker not installed or not running")raise DeploymentError("Docker not available")def build_docker_image(image_name, image_tag):try:client = from_env()image, build_logs = client.images.build(path='.',tag=f"{image_name}:{image_tag}",rm=True)logging.info(f"Successfully built image {image.tags}")return imageexcept DockerException as e:logging.error(f"Docker build error: {str(e)}")raise DeploymentError("Docker build failed")def push_to_ecr(aws_clients, image_name, image_tag):try:auth = aws_clients.ecr.get_authorization_token()username, password = auth['authorizationData'][0]['authorizationToken'].decode('utf-8').split(':')registry = auth['authorizationData'][0]['proxyEndpoint']client = from_env()client.login(username=username, password=password, registry=registry)ecr_image = f"{registry.replace('https://', '')}/{image_name}:{image_tag}"image = client.images.get(f"{image_name}:{image_tag}")image.tag(ecr_image)push_log = client.images.push(ecr_image)logging.info(f"Image pushed to ECR: {ecr_image}")return ecr_imageexcept ClientError as e:logging.error(f"AWS API error: {str(e)}")raise DeploymentError("ECR operation failed")def deploy_to_ecs(aws_clients, ecr_image, config):try:# Update task definitiontask_definition = {'family': config['deployment']['image_name'],'executionRoleArn': 'ecsTaskExecutionRole','containerDefinitions': [{'name': 'web','image': ecr_image,'portMappings': [{'containerPort': int(config['deployment']['port']),'hostPort': int(config['deployment']['port'])}],'essential': True}],'requiresCompatibilities': ['FARGATE'],'networkMode': 'awsvpc','cpu': '256','memory': '512'}response = aws_clients.ecs.register_task_definition(**task_definition)task_arn = response['taskDefinition']['taskDefinitionArn']logging.info(f"Registered task definition: {task_arn}")# Update serviceaws_clients.ecs.update_service(cluster=config['aws']['ecs_cluster'],service=config['aws']['ecs_service'],taskDefinition=task_arn,forceNewDeployment=True)logging.info("Service updated successfully")except ClientError as e:logging.error(f"ECS deployment error: {str(e)}")raise DeploymentError("ECS deployment failed")def main():try:config = load_config()aws_clients = AWSClients(config['aws']['region'])logging.info("Starting deployment process")# Docker operationscheck_docker()build_docker_image(config['deployment']['image_name'],config['deployment']['image_tag'])ecr_image = push_to_ecr(aws_clients,config['deployment']['image_name'],config['deployment']['image_tag'])# ECS deploymentdeploy_to_ecs(aws_clients, ecr_image, config)logging.info("Deployment completed successfully")print("Deployment successful! Service is updating...")except DeploymentError as e:logging.error(f"Deployment failed: {str(e)}")print(f"Error: {str(e)}")except Exception as e:logging.error(f"Unexpected error: {str(e)}")print(f"Unexpected error: {str(e)}")if __name__ == "__main__":main()

使用说明:

  1. 确保已安装以下依赖:
  • Docker
  • Python 3.8+
  • AWS CLI 配置好凭证
  1. 部署步骤:
# 安装Python依赖
pip install -r requirements.txt# 配置AWS凭证(如果尚未配置)
aws configure# 运行部署脚本
python deploy.py

这个实现包含以下功能:

  1. 前端界面:
  • 响应式聊天界面
  • 消息气泡显示
  • 用户输入和发送功能
  • 模拟API调用(需后端实现)
  1. 部署功能:
  • Docker镜像构建和推送
  • ECS服务更新
  • 完整的错误处理
  • 日志记录
  • 配置管理
  1. 安全特性:
  • AWS凭证安全管理
  • Docker安全构建
  • 安全组配置(需在AWS控制台预先配置)

注意:实际部署前需要完成以下准备工作:

  1. 在AWS创建ECR仓库
  2. 创建ECS集群和任务执行角色
  3. 配置VPC和安全组
  4. 在config.ini中填写正确的AWS资源配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32257.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2025前端高频面试题——系列一之MVC和MVVM】

前端高频面试题——系列一之MVC和MVVM 前言一、MVC的基本逻辑二、MVVM的基本逻辑总结 提示&#xff1a;片尾总结了要点&#xff0c;硬背的话直接跳到最后 前言 相信持续关注我文章的小伙伴知道我之前就MVC和MVVM做过较为详细的讲解&#xff0c;但是我发现&#xff0c;他依旧是…

axure11安装教程包含下载、安装、汉化、授权(附安装包)图文详细教程

文章目录 前言一、axure11安装包下载二、axure11安装教程1.启动安装程序2.安装向导界面3.安装协议协议页面2.选择安装位置3.开始安装4.完成安装 三、axure11汉化教程1.axure11汉化包2.axure11汉化设置 四、axure11授权教程1.打开axure112.设置使用方式3.输入许可证号4.axure11安…

Ubuntu 22.04使用pigz多线程快速解压/压缩文件

最近搞项目&#xff0c;资料太大&#xff0c;解压时间太久&#xff0c;于是想办法解决。 开贴记录。 1.安装pigz sudo apt install pigz 2.解压资料 解压命令为 tar --use-compress-programpigz -xvpf ***.tar.gz 将最后的部分***.tar.gz换成你自己的文件即可 例如 ti…

版本控制器Git(3)

文章目录 前言一、分支管理策略二、Bug分支管理遇到Bug时的处理方法使用 git stash 暂存工作区内容创建并切换到Bug修复分支恢复之前的工作 三、临时分支的删除总结 前言 我们在上篇讲到了分支&#xff0c;现在我们就着这个继续来讲解&#xff01; 一、分支管理策略 master分支…

pytest+allure+jenkins

本地运行参考&#xff1a;pytestallure 入门-CSDN博客 jenkins运行如下&#xff1a; 安装插件&#xff1a;allure 配置allure安装目录 配置pytest、allure 环境变量 配置流水线 进行build,结果如下 ,点击allure report 查看结果

AI术语整理(持续更新)

在AI相关的学习和使用中&#xff0c;经常会被各种术语混淆&#xff0c;搞清楚术语本来的含义是关键&#xff0c;本文收集整理了部分AI相关术语&#xff0c;会持续更新。 基础概念 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;&#xff1a;一种模…

【蓝桥杯单片机】第十一届省赛

一、真题 二、创建工程 1.在C盘以外的盘新建文件夹&#xff0c;并在文件夹里面创建两个文件夹Driver 和Project 2.打开keil软件&#xff0c;在新建工程并选择刚刚建好的project文件夹&#xff0c;以准考证号命名 3.选择对应的芯片型号 4.选择否&#xff0c;即不创建启动文件 …

GMT绘图笔记:用深度作为表面高度(Z 值),用其他物理量(泊松比)给表面着色

之前用GMT绘制莫霍面的三维示意图是用的莫霍面的深度作为表面着色。 GMT绘图笔记&#xff1a;绘制堆叠三维图_gmt画图-CSDN博客 如果要换成其他的物理场&#xff0c;比如泊松比&#xff0c;则需要使用以下的代码 gmt begin BS_figures2 png,pdf E600 # 绘制底图 # Chistrong…

docker搭建elk

文章目录 1.拉取镜像2.ES配置3.logstash配置4.kibana配置5.创建自定义网络6.docker-compose.yml文件7.springboot对接Logstash1.创建一个springboot项目引入主要依赖2.application.yml配置3.resources目录中新增logback-spring.xml4.启动项目&#xff0c;搞点日志5.进入kibana控…

golang算法快慢指针

876. 链表的中间结点 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间结…

瑞云渲染专访奥斯卡提名制片人兼女性动画人协会副主席Jinko Gotoh!

都说CG行业男多女少&#xff0c;女同胞都是珍稀资源&#xff0c;但艺术领域怎么可以没有女性视角呢&#xff1f;本期推文我们邀请到了动画行业资深大佬后藤纯子Jinko Gotoh&#xff0c;作为奥斯卡提名制片人兼女性动画人协会副主席&#xff0c;后藤纯子始终以多元文化倡导者与创…

道路运输安全员考试:备考中的心理调适与策略

备考道路运输安全员考试&#xff0c;心理调适同样重要。考试压力往往会影响考生的学习效率和考试发挥。​ 首先&#xff0c;要正确认识考试压力。适度的压力可以激发学习动力&#xff0c;但过度的压力则会适得其反。当感到压力过大时&#xff0c;要学会自我调节。可以通过运动…

卡尔曼滤波算法从理论到实践:在STM32中的嵌入式实现

摘要&#xff1a;卡尔曼滤波&#xff08;Kalman Filter&#xff09;是传感器数据融合领域的经典算法&#xff0c;在姿态解算、导航定位等嵌入式场景中广泛应用。本文将从公式推导、代码实现、参数调试三个维度深入解析卡尔曼滤波&#xff0c;并给出基于STM32硬件的完整工程案例…

【Linux】:线程池

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来线程池相关的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构…

SpringMVC (一)基础

目录 SpringMVC 一 简单使用 1 新建模块选择指定参数 2 创建实现类 3 将项目启动 4 运行结果&#xff1a;在浏览器当中响应执行 二 RequestMapping 三 请求限定 SpringMVC SpringMVC是Spring的web模块&#xff0c;用来开发Web应用&#xff0c;SpringMVC应用最终作为B/…

tomcat应用的作用以及安装,以及tomcat软件的开机自启动。

一.tomcat介绍 1.作用 tomcat是一款用来部署网站服务器的一款软件。 动态网站主流语言&#xff1a; PHP, lamp/lnmp平台 Java语言&#xff0c;运行在tomcat平台。【只要这个网站或者软件是Java语言写的&#xff0c;我们都可以在tomcat平台上去运行这个java程序。】 网站是…

CSDN博客:Markdown编辑语法教程总结教程(下)

❤个人主页&#xff1a;折枝寄北的博客 Markdown编辑语法教程总结 前言1. LaTex数学公式2. 插入不同类别的图2.1 插入甘特图2.2 插入UML图2.3 插入Mermaid流程图2.4 插入Flowchart流程图2.5 插入classDiagram类图 3. CSDN快捷键4. 字体相关设置4.1 字体样式改变4.2 字体大小改变…

AI模型的构建过程是怎样的(下)

你好,我是舒旻。 上节课,我们讲了一个模型构建的前 2 个环节,模型设计和特征工程。今天,我们继续来讲模型构建的其他 3 个环节,说说模型训练、模型验证和模型融合中,算法工程师的具体工作内容,以及 AI 产品经理需要掌握的重点。 模型训练 模型训练是通过不断训练、验证…

K邻近算法

K邻近算法 1 算法介绍 1.1 什么是K-NN K-NN&#xff08;K Near Neighbor&#xff09;&#xff1a;k个最近的邻居&#xff0c;即每个样本都可以用它最接近的k个邻居来代表。K-NN算法属于监督学习方式的分类算法&#xff0c;即计算某给点到每个点的距离作为相似度的反馈。简单…

晋升系列4:学习方法

每一个成功的人&#xff0c;都是从底层开始打怪&#xff0c;不断的总结经验&#xff0c;一步一步打上来的。在这个过程中需要坚持、总结方法论。 对一件事情长久坚持的人其实比较少&#xff0c;在坚持的人中&#xff0c;不断的总结优化的更少&#xff0c;所以最终达到高级别的…