如何通过Ansible从控制机将网站内容复制到Docker容器
解决Ansible部署Docker容器时本地网页目录挂载失效问题
问题核心
你遇到的问题是控制节点的myweb目录未同步到目标Docker主机,直接使用{{ playbook_dir }}/myweb作为挂载源,会让目标主机尝试挂载自身不存在的路径(playbook_dir是控制端本地路径),导致容器内仍显示Apache默认页面。
解决方案步骤
1. 同步控制端网页目录到目标主机
在Ansible剧本中添加任务,将控制端的myweb目录复制到目标主机的固定路径(例如/opt/myweb):
- name: 同步控制端网页目录到目标主机 synchronize: src: "{{ playbook_dir }}/myweb/" dest: "/opt/myweb/" rsync_opts: - "--chown=www-data:www-data" # 匹配Apache容器的运行用户权限
若未安装rsync,可改用copy模块(适合小目录):
- name: 复制控制端网页目录到目标主机 copy: src: "{{ playbook_dir }}/myweb/" dest: "/opt/myweb/" owner: www-data group: www-data mode: '0755'
2. 修改容器挂载路径为目标主机路径
更新container_configs中的volumes配置,将源路径替换为目标主机的本地路径:
volumes: - "/opt/myweb:/usr/local/apache2/htdocs"
3. 确保目标主机目录权限正确
如果使用synchronize模块,需单独添加权限配置任务:
- name: 设置网页目录权限 file: path: "/opt/myweb" state: directory owner: www-data group: www-data recurse: yes mode: '0755'
修改后的关键剧本片段
# ... 保留原有Docker安装、网络创建等任务 ... - name: 同步控制端网页目录到目标主机 synchronize: src: "{{ playbook_dir }}/myweb/" dest: "/opt/myweb/" rsync_opts: - "--chown=www-data:www-data" - name: 设置网页目录权限 file: path: "/opt/myweb" state: directory owner: www-data group: www-data recurse: yes mode: '0755' - name: 定义容器配置列表 set_fact: container_configs: - name: 20024471_B9IS121-container-1 image: httpd:latest volumes: - "/opt/myweb:/usr/local/apache2/htdocs" ports: - "8080:80" networks: - name: 20024471_B9IS121-network ipv4_address: 172.168.11.2 networks_cli_compatible: yes container_default_behavior: compatibility network_mode: default # ... 保留原有容器部署任务 ...
验证方法
部署完成后执行以下操作确认:
- 在目标主机检查目录内容:
ls /opt/myweb,确认文件已同步。 - 进入容器检查挂载:
docker exec -it 20024471_B9IS121-container-1 ls /usr/local/apache2/htdocs,确认自定义文件存在。 - 访问
http://目标主机IP:8080,验证是否显示自定义网页。
内容的提问来源于stack exchange,提问作者Dig The Code
相关产品推荐
相关产品推荐

