如何在Elastic Beanstalk的Docker.run.json v1中指定容器名称
如何为Elastic Beanstalk的Docker容器设置固定名称?
方法一:容器启动后重命名
你可以通过.ebextensions添加后置脚本,在容器启动完成后将其重命名为固定名称。
创建.ebextensions/01-rename-container.config文件,内容如下:
files: "/opt/elasticbeanstalk/hooks/appdeploy/post/00_rename_container.sh": mode: "000755" owner: root group: root content: | #!/bin/bash # 根据镜像名称获取容器ID(替换成你Dockerrun里的镜像全名) CONTAINER_ID=$(docker ps --filter "ancestor=xxxxxx.dkr.ecr.us-east-1.amazonaws.com/myproject:build-xxxx-xxx-xxx-xx-xxx" --format "{{.ID}}") # 重命名为固定名称,比如my-app-container if [ -n "$CONTAINER_ID" ]; then docker rename $CONTAINER_ID my-app-container fi
部署后,容器启动完成就会被重命名为my-app-container,之后你就能用docker exec my-app-container echo "Hello world"执行命令。
方法二:修改EB的容器启动脚本
直接修改Elastic Beanstalk启动容器的脚本,添加--name参数指定固定名称。
创建.ebextensions/01-modify-docker-start.config文件:
commands: 01_add_container_name: command: | # 找到EB启动容器的脚本,添加--name参数 sed -i '/docker run/ s/$/ --name my-app-container/' /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh
注意:不同版本的Elastic Beanstalk可能会调整启动脚本的路径,需要根据实际环境验证。
更推荐的方案:动态获取容器ID(无需固定名称)
其实不需要强行设置固定名称,你可以在cron任务里动态获取目标容器的ID,直接执行命令,这样更适配EB的容器调度逻辑:
比如cron的任务命令可以写成:
docker exec $(docker ps --filter "ancestor=你的镜像全名" --format "{{.ID}}") echo "Hello world"
或者通过端口过滤(因为你的容器暴露80端口):
docker exec $(docker ps --filter "publish=80" --format "{{.ID}}") echo "Hello world"
这种方式不需要依赖固定名称,避免EB启动逻辑变化导致的失效问题。
内容的提问来源于stack exchange,提问作者anderlaini
相关产品推荐
相关产品推荐

