--- # Install docker-compose - name: Ensure pip to be available apt: name: python-pip cache_valid_time: 86400 - name: Install or update docker-compose pip: name: docker-compose executable: pip state: latest register: docker_compose # Configure docker-compose - name: Create configuration directory file: dest: /etc/docker-compose state: directory mode: 0700 - name: Write docker-compose.yml template: dest: /etc/docker-compose/docker-compose.yml src: templates/docker-compose.yml mode: 0600 register: compose_file - name: Validate configuration command: docker-compose config -q args: chdir: /etc/docker-compose when: compose_file.changed and docker_compose_validate # Install and start services - name: Install docker-compose.service copy: dest: /etc/systemd/system/docker-compose.service content: | [Unit] Description=Docker Compose container starter After=docker.service network-online.target Requires=docker.service network-online.target [Service] WorkingDirectory=/etc/docker-compose Type=oneshot RemainAfterExit=yes ExecStartPre=-/usr/local/bin/docker-compose pull --quiet --ignore-pull-failures ExecStart=/usr/local/bin/docker-compose up -d --remove-orphans ExecStop=/usr/local/bin/docker-compose {{ docker_compose_stop_action }} ExecReload=/usr/local/bin/docker-compose pull --quiet --ignore-pull-failures ExecReload=/usr/local/bin/docker-compose up -d --remove-orphans [Install] WantedBy=docker.service register: docker_compose_service - name: Enable docker-compose service systemd: name: docker-compose.service daemon_reload: yes enabled: yes - name: Restart service if service configuration changed systemd: name: docker-compose.service daemon_reload: yes state: restarted when: docker_compose_service.changed and packer_build_name is not defined - name: Reload and apply configuration systemd: name: docker-compose.service state: reloaded when: (docker_compose.changed or compose_file.changed) and packer_build_name is not defined - name: Install docker-compose-reload.service copy: dest: /etc/systemd/system/docker-compose-reload.service content: | [Unit] Description=Refresh images and update containers [Service] Type=oneshot ExecStart=/bin/systemctl reload-or-restart docker-compose.service - name: Install docker-compose-reload.timer copy: dest: /etc/systemd/system/docker-compose-reload.timer content: | [Unit] Description=Refresh images and update containers Requires=docker-compose.service After=docker-compose.service [Timer] OnCalendar=*:0/{{ docker_compose_reload_minutes }} RandomizedDelaySec={{ docker_compose_reload_max_delay }} [Install] WantedBy=timers.target register: docker_compose_reload_timer - name: Enable docker-compose-reload.timer systemd: name: docker-compose-reload.timer daemon_reload: yes enabled: yes - name: Restart docker-compose-reload.timer if it changed systemd: name: docker-compose-reload.timer daemon_reload: yes state: restarted when: docker_compose_reload_timer.changed and packer_build_name is not defined - name: Install docker-clean script copy: content: | #!/bin/bash set -euo pipefail function step() { echo $@; } step "Removing containers created / exited >= ~1h ago..." CONTAINERS=$(docker ps -a | gawk '/(hours?|days?|weeks?|months?) ago\s+(Created|Exited)/{ print $1 }' | xargs) [ -n "${CONTAINERS}" ] && docker rm ${CONTAINERS} step "Removing unused and dangling images..." docker image prune -a -f dest: /usr/local/bin/docker-clean mode: '0755' owner: 'root' group: 'root' when: docker_compose_add_cleanjob - name: Install docker-clean.service copy: dest: /etc/systemd/system/docker-clean.service content: | [Unit] Description=Clean out old containers and unused images [Service] Type=oneshot ExecStart=/usr/local/bin/docker-clean when: docker_compose_add_cleanjob - name: Install docker-clean.timer copy: dest: /etc/systemd/system/docker-clean.timer content: | [Unit] Description=Clean out old containers and unused images [Timer] OnCalendar=*:0 [Install] WantedBy=timers.target register: docker_compose_clean_timer when: docker_compose_add_cleanjob - name: Enable docker-clean timer systemd: name: docker-clean.timer daemon_reload: yes enabled: yes when: docker_compose_add_cleanjob - name: Restart docker-clean.timer if it changed systemd: name: docker-clean.timer daemon_reload: yes state: restarted when: docker_compose_clean_timer is defined and docker_compose_clean_timer.changed and packer_build_name is not defined and docker_compose_add_cleanjob - name: Deactivate docker-clean timer systemd: name: docker-clean.timer daemon_reload: yes enabled: no when: not docker_compose_add_cleanjob - name: Uninstall docker-clean components file: dest: '{{ item }}' state: absent with_items: - /usr/local/bin/docker-clean - /etc/systemd/system/docker-clean.service - /etc/systemd/system/docker-clean.timer when: not docker_compose_add_cleanjob