You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过bitbucket-pipelines.yml向已构建的Docker镜像复制文件?

解决方案:将AWS Secrets Manager中的MQTT证书注入Docker镜像

核心问题分析

原流程中MQTT证书存储在代码库的config目录,构建镜像时直接复制到镜像内。现在证书迁移到AWS Secrets Manager,流水线已能获取证书,但需要将证书注入已构建的Docker镜像的config目录,此前的两种尝试均未留存修改:

  1. 启动镜像复制证书后未提交镜像修改,步骤结束后容器销毁,修改丢失
  2. 未正确获取容器ID导致无法执行复制操作

可行方案

方案一:构建镜像时直接注入证书(推荐)

在Docker镜像构建阶段,直接将从Secrets Manager获取的证书复制到镜像内,避免事后修改镜像的额外步骤。

修改步骤:

  1. 更新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
  1. 更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 07:20:09