如何通过无密码脚本将Docker容器内文件传输至本地(Bitbucket Pipelines环境)
解决Bitbucket Pipelines容器无密码传输文件到本地的方案
核心问题分析
你之前的操作搞反了SSH认证方向:把本地公钥放到容器的authorized_keys是用来让本地机器登录容器的,但现在需要容器主动连接本地机器,所以应该让容器持有能访问本地机器的SSH私钥,同时本地机器的authorized_keys添加对应公钥。
可行方案一:使用Bitbucket安全变量传入SSH私钥
这是最适合流水线自动化的方案,步骤如下:
本地机器准备
- 生成一对SSH密钥(如果没有的话):
ssh-keygen -t ed25519 -C "bitbucket-pipeline" - 将公钥添加到本地机器的
~/.ssh/authorized_keys文件:cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys - 确保本地机器的SSH服务允许密钥登录,且端口(默认22)能被Bitbucket Pipelines的容器访问(需要公网IP或内网打通)
- 生成一对SSH密钥(如果没有的话):
Bitbucket配置
- 进入仓库的
Settings > Repository variables,添加一个名为SSH_PRIVATE_KEY的变量,值为刚才生成的私钥内容(~/.ssh/id_ed25519里的文本),勾选Secured选项加密存储
- 进入仓库的
流水线脚本配置(bitbucket-pipelines.yml)
在步骤中添加密钥配置和scp命令:pipelines: default: - step: script: # 创建SSH目录并设置权限 - mkdir -p ~/.ssh - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519 - chmod 600 ~/.ssh/id_ed25519 # 提前扫描本地机器的SSH密钥,避免首次连接的确认提示 - ssh-keyscan <你的本地机器IP/域名> >> ~/.ssh/known_hosts # 执行scp传输文件 - scp /容器内目标文件路径 <本地用户名>@<本地机器IP>:<本地存储路径>
可行方案二:使用Bitbucket Artifacts(非直接传本地)
如果不需要自动传到本地机器,只是需要保留流水线生成的文件,可以用Bitbucket的Artifacts功能:
pipelines: default: - step: script: - # 你的构建/生成文件的命令 artifacts: - /容器内目标文件路径/**
执行完流水线后,可在Bitbucket的流水线页面下载这些文件,也可以通过Bitbucket API自动化拉取到本地。
常见坑点
- SSH密钥权限必须严格设置为
600,否则SSH会拒绝使用该密钥 - 必须添加
ssh-keyscan步骤,否则首次连接会弹出确认提示,导致脚本卡住 - 本地机器要确保防火墙开放SSH端口,且能被Bitbucket Pipelines的公网IP访问(可在Bitbucket文档中查询Pipelines的IP段,添加到白名单)
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

