如何通过Ansible实现两个Docker容器间的文件移动/复制
Ansible实现两个Docker容器间文件传输方案
全程不需要手动登录容器/宿主机操作,所有步骤通过Ansible playbook完成,不需要给容器额外装SSH等冗余服务,两种常用落地方式:
方案1:Ansible控制节点中转(通用场景,跨宿主机也可用)
依赖community.docker集合,先执行ansible-galaxy collection install community.docker安装即可,原理是通过Ansible的Docker连接插件直接和容器交互,先把文件从源容器拉到Ansible执行节点的临时缓存目录,再推送到目标容器。
路径配置规则
- 从源容器取文件时,
src填appOne容器内部的文件绝对路径,不要写宿主机路径,不要带容器名前缀 - 往目标容器推文件时,
dest填appTwo容器内部的目标存放绝对路径,目标目录不存在时模块会自动递归创建
Playbook示例
- name: 跨容器传输文件 hosts: localhost gather_facts: false tasks: # 从appOne拉取文件 - name: 提取appOne内生成的文件 community.docker.docker_container_copy: container_name: appOne src: /path/inside/appOne/your_file # 替换成appOne内实际文件路径,比如/app/output/result.json dest: /tmp/ansible_cache/your_file direction: from_container mode: '0644' # 推送到appTwo - name: 写入文件到appTwo community.docker.docker_container_copy: container_name: appTwo src: /tmp/ansible_cache/your_file dest: /path/inside/appTwo/your_file # 替换成appTwo内实际目标路径,比如/app/input/result.json direction: to_container mode: '0644' # 清理临时缓存 - name: 删除Ansible节点临时文件 ansible.builtin.file: path: /tmp/ansible_cache/your_file state: absent
如果两个容器跑在远程宿主机上,只需要在任务参数里加api_version: auto和docker_host: 远程宿主机Docker连接地址即可,不需要改核心逻辑。
方案2:同宿主机直转(大文件场景无中转开销)
如果appOne和appTwo运行在同一台宿主机上,不需要把文件拉到Ansible控制节点,直接在宿主机层面通过docker cp流转,传输速度更快:
- name: 同宿主机容器间文件传输 hosts: <你的容器所在宿主机的inventory主机标识> gather_facts: false tasks: - name: 从appOne导出文件到宿主机临时目录 ansible.builtin.shell: docker cp appOne:/path/inside/appOne/your_file /tmp/host_temp_file - name: 从宿主机临时目录导入到appTwo ansible.builtin.shell: docker cp /tmp/host_temp_file appTwo:/path/inside/appTwo/your_file - name: 清理宿主机临时文件 ansible.builtin.file: path: /tmp/host_temp_file state: absent
注意:不要尝试直接在两个容器间配置scp/rsync传输,这类方案需要提前在两个Python 3.8容器内安装SSH服务、配置免密登录,引入不必要的运行时依赖,生产环境不推荐使用。
内容的提问来源于stack exchange,提问作者Akael
相关产品推荐
相关产品推荐

