如何在自定义Nginx Docker镜像中安装AWS CLI并自动传递凭证
解决方案
分为两个核心部分:Dockerfile改造安装AWS CLI、运行时凭证注入(覆盖Jenkins+本地两种场景)
1. 改造Dockerfile安装AWS CLI
你使用的nginx:1.13.2基础镜像属于Debian系,直接在原有Dockerfile基础上增加AWS CLI v2的安装步骤即可,修改后的完整Dockerfile如下:
FROM library/nginx:1.13.2 LABEL maintainer="san@test.com" # 安装AWS CLI依赖及AWS CLI v2 RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ unzip \ && rm -rf /var/lib/apt/lists/* \ && curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \ && unzip awscliv2.zip \ && ./aws/install \ && rm -rf aws awscliv2.zip # 原有逻辑保持不变 # Remove the default Nginx configuration file RUN rm -v /etc/nginx/nginx.conf # Copy a configuration file from the current directory ADD nginx.conf /etc/nginx/ # forward request and error logs to docker log collector RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log \ # Make PageSpeed cache writable && mkdir -p /var/cache/ngx_pagespeed && \ chmod -R o+wr /var/cache/ngx_pagespeed ADD server.crt /etc/nginx/ssl/ ADD server.key /etc/nginx/ssl/ ADD conf.d/ /etc/nginx/conf.d/ ADD proxy.d/ /etc/nginx/proxy.d/ CMD ["nginx", "-g", "daemon off;"]
注:不要在Dockerfile中硬编码任何AWS凭证,所有凭证均通过运行时注入的方式传入,避免凭证泄露风险
2. 运行时凭证注入方案
AWS CLI会自动读取环境变量、挂载的凭证文件、关联的IAM角色等来源的凭证,不需要额外配置,对应两种场景的处理方式如下:
2.1 Jenkins环境
你已经配置了aws-credentials类型的凭证,直接在Pipeline运行镜像的步骤中,把凭证的AK/SK作为环境变量注入即可,示例如下:
pipeline { agent any environment { AWS_CREDS = credentials('aws-credentials') // 填写你的凭证ID,和docker.withRegistry用的一致 } stages { // 原有构建镜像阶段保持不变 stage('Build Docker image') { steps { script { docker.withRegistry("http://xyz-1.amazonaws.com", "ecr:eu-central-1:aws-credentials") { def customImage = docker.build("web-proxy:${CY_RELEASE_VERSION}", ".") customImage.push() } } } } // 新增运行镜像执行操作的阶段示例 stage('Run Nginx Config Sync') { steps { sh """ docker run --rm \ -e AWS_ACCESS_KEY_ID=${AWS_CREDS_USR} \ -e AWS_SECRET_ACCESS_KEY=${AWS_CREDS_PSW} \ -e AWS_DEFAULT_REGION=eu-central-1 \ web-proxy:${CY_RELEASE_VERSION} \ aws s3 cp s3://你的配置桶/nginx.conf /etc/nginx/nginx.conf """ } } } }
如果你的Jenkins运行在AWS EC2/EKS环境中,更安全的方案是直接给Jenkins节点绑定具有S3访问权限的IAM角色,不需要注入AK/SK,AWS CLI会自动读取角色凭证。
2.2 本地运行场景
本地已经配置过AWS凭证的情况下,有两种方式传入凭证:
- 方式1:挂载本地~/.aws目录到容器中
docker run --rm -v ~/.aws:/root/.aws web-proxy-dev_san_1:1.11 aws s3 ls
- 方式2:临时传入环境变量
docker run --rm \ -e AWS_ACCESS_KEY_ID=你的AK \ -e AWS_SECRET_ACCESS_KEY=你的SK \ -e AWS_DEFAULT_REGION=eu-central-1 \ web-proxy-dev_san_1:1.11 aws s3 ls
3. 自定义启动逻辑
你要动态修改Nginx配置的需求,可以写一个启动脚本作为入口,示例脚本start.sh如下:
#!/bin/bash # 从S3同步最新配置 aws s3 cp s3://你的配置桶/conf.d/ /etc/nginx/conf.d/ --recursive # 校验Nginx配置合法性 nginx -t # 启动Nginx exec nginx -g "daemon off;"
然后在Dockerfile中增加脚本拷贝和执行权限配置:
ADD start.sh /start.sh RUN chmod +x /start.sh CMD ["/start.sh"]
内容的提问来源于stack exchange,提问作者Sandeep Nair
相关产品推荐
相关产品推荐

