如何通过bitbucket-pipelines.yml向已构建的Docker镜像复制文件?
解决方案:将AWS Secrets Manager中的MQTT证书注入Docker镜像
核心问题分析
原流程中MQTT证书存储在代码库的config目录,构建镜像时直接复制到镜像内。现在证书迁移到AWS Secrets Manager,流水线已能获取证书,但需要将证书注入已构建的Docker镜像的config目录,此前的两种尝试均未留存修改:
- 启动镜像复制证书后未提交镜像修改,步骤结束后容器销毁,修改丢失
- 未正确获取容器ID导致无法执行复制操作
可行方案
方案一:构建镜像时直接注入证书(推荐)
在Docker镜像构建阶段,直接将从Secrets Manager获取的证书复制到镜像内,避免事后修改镜像的额外步骤。
修改步骤:
- 更新bitbucket-pipelines.yml:先获取证书到临时目录,再执行构建
definitions: steps: - step: &docker_build name: "Docker Build with Certificates" services: - docker caches: - pip script: - cd . - export IMAGE_NAME_EXTENSION="latest" - VERSION=$(<version.txt) # 创建临时目录存储证书 - mkdir -p ./temp-config # 从AWS Secrets Manager拉取证书(根据实际密钥结构调整) - aws secretsmanager get-secret-value --secret-id YOUR_MQTT_CERTS_ID --query SecretString --output text | jq -r '.cert_file' > ./temp-config/cert.pem - aws secretsmanager get-secret-value --secret-id YOUR_MQTT_CERTS_ID --query SecretString --output text | jq -r '.key_file' > ./temp-config/key.pem # 构建镜像(Dockerfile需同步修改) - docker build -t $IMAGE_NAME . - docker save --output tmp-image.docker $IMAGE_NAME artifacts: - tmp-image.docker pipelines: branches: master: - step: *docker_build
- 更新Dockerfile:将临时目录的证书复制到镜像的
config目录
FROM python:3.8-slim RUN apt-get -y update && apt-get install -y --no-install-recommends \ libgl1-mesa-glx \ libglib2.0-0 \ wget \ git \ python3 \ ca-certificates \ gcc \ libc6-dev \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt . RUN pip install --upgrade pip RUN pip install -r requirements.txt COPY src/some_code/ . # 替换原COPY指令,复制临时目录的证书到镜像config目录 COPY temp-config/ ./config/ CMD ["python3","abc.py"]
方案二:修改已构建镜像并提交新镜像
若必须先构建基础镜像再注入证书,可通过运行容器、复制证书、提交镜像的方式留存修改:
修改后的bitbucket-pipelines.yml:
definitions: steps: - step: &docker_build name: "Docker Build & Inject Certificates" services: - docker caches: - pip script: - cd . - export IMAGE_NAME_EXTENSION="latest" - VERSION=$(<version.txt) # 创建临时目录并拉取证书 - mkdir -p ./temp-config - aws secretsmanager get-secret-value --secret-id YOUR_MQTT_CERTS_ID --query SecretString --output text | jq -r '.cert_file' > ./temp-config/cert.pem - aws secretsmanager get-secret-value --secret-id YOUR_MQTT_CERTS_ID --query SecretString --output text | jq -r '.key_file' > ./temp-config/key.pem # 构建基础镜像 - docker build -t $IMAGE_NAME . # 启动容器并获取ID - CONTAINER_ID=$(docker run -d $IMAGE_NAME sleep 3600) # 复制证书到容器的config目录 - docker cp ./temp-config/. $CONTAINER_ID:/config/ # 提交容器为新镜像 - docker commit $CONTAINER_ID $IMAGE_NAME:$IMAGE_NAME_EXTENSION # 清理临时容器 - docker stop $CONTAINER_ID - docker rm $CONTAINER_ID # 保存最终镜像作为工件 - docker save --output tmp-image.docker $IMAGE_NAME:$IMAGE_NAME_EXTENSION artifacts: - tmp-image.docker pipelines: branches: master: - step: *docker_build
注意事项
- 确保流水线环境已安装
aws-cli和jq,若未安装可在script开头添加:apt-get update && apt-get install -y awscli jq - 替换
YOUR_MQTT_CERTS_ID为实际的AWS Secrets Manager密钥ID - 根据SecretString内的证书字段名调整
jq的查询参数(如你的证书键名可能是mqtt_cert、mqtt_key等)
内容的提问来源于stack exchange,提问作者m00s3
相关产品推荐
相关产品推荐

