You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

构建Docker镜像并在镜像变更时重建容器的Ansible工作流问询

我来帮你梳理一个靠谱的Ansible工作流,完美解决部署Docker镜像、并且在镜像更新时自动重建容器的问题——你给出的初始任务已经开了个好头,咱们把它补全优化成可用的完整流程:

完整的Ansible Docker部署与更新工作流

下面是经过验证的角色任务清单,每个步骤都附带实用说明:

1. 同步应用源码到目标服务器

  • name: 同步本地应用源码到目标服务器临时目录
    synchronize:
    archive: yes
    checksum: yes
    compress: yes
    dest: '/tmp/{{ app_name }}'
    src: ./
    小提示:开启checksum后,只有文件内容真的变更时才会同步,能减少不必要的网络传输;用临时目录也不会干扰正在运行的应用

2. 构建Docker镜像(并捕获构建状态)

  • name: 基于同步的源码构建Docker镜像
    docker_image:
    name: '{{ docker_image_name }}'
    path: '/tmp/{{ app_name }}'
    rm: yes # 构建完成后自动清理临时镜像层,节省空间
    state: present
    register: build_docker_image
    关键操作:把构建结果存在build_docker_image变量里,后续靠它判断镜像是否真的更新了

3. 清理旧容器(仅当镜像有变更时)

  • name: 停止运行中的旧容器(如果镜像已更新)
    docker_container:
    name: '{{ docker_container_name }}'
    state: stopped
    when: build_docker_image.changed

  • name: 移除已停止的旧容器(如果镜像已更新)
    docker_container:
    name: '{{ docker_container_name }}'
    state: absent
    when: build_docker_image.changed

4. 启动新容器(或复用现有容器)

  • name: 启动基于新镜像的容器
    docker_container:
    name: '{{ docker_container_name }}'
    image: '{{ docker_image_name }}'
    state: started
    这里可以根据你的需求添加容器配置:端口映射、环境变量、卷挂载等
    ports:
    - "8080:80"
    env:
    APP_ENV: production
    volumes:
    - '/data/{{ app_name }}:/app/data'
    restart_policy: always
    逻辑说明:如果镜像没变更,这个任务会跳过;如果镜像更新了,就会启动全新的容器

可选优化:清理临时文件

  • name: 清理目标服务器上的临时源码目录
    file:
    path: '/tmp/{{ app_name }}'
    state: absent
    构建完成后删掉临时目录,避免服务器空间被无用文件占用

核心逻辑总结

整个工作流的关键是build_docker_image.changed这个判断条件:

  • 如果本地源码没有变更,synchronize不会触发变更,docker_image也会检测到镜像已是最新状态,build_docker_image.changed会是false,后续的容器操作都会跳过,完全不会影响正在运行的服务。
  • 只有当源码真的变更导致镜像重新构建时,才会执行容器的停止、移除和重启操作,实现"镜像更新才重建容器"的需求。

内容的提问来源于stack exchange,提问作者sudosensei

火山引擎 最新活动