我正在将Redis实例部署到ECS容器中,并与FARGATE一起运行。下面是我的容器定义的示例:
[
{
"name": "redis",
"image": "redis",
"restart": "always",
"portMappings": [
{"containerPort": 6379,
"hostPort": 6379}
],
"healthcheck": {
"Command": ["/bin/sh", "redis-cli", "SMEMBERS", "clientSet","|", "grep", "39e24s4"],
"Interval": 30,
"Timeout": 10,
"Retries": 5
},
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "redis-log-group",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "redis"
}
}
}
]我的健康检查寻找一个预先实例化的客户端。我要做的是在redis映像被实例化后立即运行以下命令,签出文档、“命令”和“entrypoint”字段,因为它们运行提供的命令,而不是实例化redis映像。
有什么字段我可以使用,或者我可以用自动化的方式(不使用Exec)来执行这样的任务吗?
redis-cli SADD clientSet <client-id>
redis-cli SMEMBERS clientSet发布于 2022-10-01 15:56:43
您不想使用ECS exec,也不能使用AWS (SSM)和docker exec的组合,因为fargate不允许docker exec。
但是,您可以在ECS启动码头容器时利用COMMAND参数。在容器定义参数中,可以在Environment下指定要运行的CMD命令,而不是通过Dockerfile在图像中指定的命令。这相当于:
docker run -p 6379:6379 redis /bin/bash -c "redis-server --daemonize yes && sleep 1 && redis-cli SADD clientSet client1 && redis-cli save && redis-cli shutdown && redis-server"让我们一个一个地看看我们在这里做什么:
redis-server --daemonize yes -启动后台中的redis服务器
sleep 1 -等待1秒,这是等待服务器完全启动redis-cli SADD clientSet client1 -将数据添加到内存中的redis设置
redis-cli save -将数据持久化到磁盘redis-cli shutdown -停止以前启动的服务器redis-server -正常启动服务器我也建议在健康检查开始之前增加一个小的宽限期。这可以使用startPeriod参数在healthcheck对象中指定。因此,我们的新容器定义如下:
[
{
"name": "redis",
"image": "redis",
"restart": "always",
"portMappings": [
{
"containerPort": 6379,
"hostPort": 6379
}
],
"healthcheck": {
"command": ["/bin/sh", "redis-cli", "SMEMBERS", "clientSet","|", "grep", "39e24s4"],
"interval": 30,
"timeout": 10,
"retries": 5,
"startPeriod": 10
},
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "redis-log-group",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "redis"
}
},
"command": [
"/bin/bash -c \"redis-server --daemonize yes && sleep 1 && redis-cli SADD clientSet rhl && redis-cli save && redis-cli shutdown && redis-server\""
]
}
]https://stackoverflow.com/questions/70935595
复制相似问题