Currently with Docker Live Restore [1] enabled and while restarting
Docker Engine - all Ceph container images will get restarted,
while the feature allows restarting docker.service without
containers downtime.
This is due to Requires=docker.service in systemd units templates,
which mandates that on docker.service restart - the ceph container
systemd units will be restarted as well.
Reworking Requires= to Wants= that is a weaker version of the former,
see [2].
Leaving After= entries, because they should allow systemd to correctly
order the startup (first docker, then ceph containers).
[1]: https://docs.docker.com/engine/daemon/live-restore/
[2]: https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html#Wants=
Fixes: https://tracker.ceph.com/issues/68028
Signed-off-by: Michal Nasiadka <mnasiadka@gmail.com>
(cherry picked from commit
e0f77686523337f37e3ddbbe40eaa92c68947195)
Conflicts:
src/cephadm/cephadmlib/templates/ceph.service.j2
src/cephadm/cephadmlib/templates/init_ctr.service.j2
src/cephadm/cephadmlib/templates/sidecar.service.j2
src/cephadm/tests/test_unit_file.py
Any modern Linux distribution should be sufficient. Dependencies
are installed automatically by the bootstrap process below.
+See `Docker Live Restore <https://docs.docker.com/engine/daemon/live-restore/>`_
+for an optional feature that allows restarting Docker Engine without restarting
+all running containers.
+
See the section :ref:`Compatibility With Podman
Versions<cephadm-compatibility-with-podman>` for a table of Ceph versions that
are compatible with Podman. Not every version of Podman is compatible with
# configuration.
After=network-online.target local-fs.target time-sync.target{docker_after}
Wants=network-online.target local-fs.target time-sync.target
-{docker_requires}
+{docker_wants}
PartOf=ceph-{fsid}.target
Before=ceph-{fsid}.target
extra_args=extra_args,
# if docker, we depend on docker.service
docker_after=' docker.service' if docker else '',
- docker_requires='Requires=docker.service\n' if docker else '')
+ docker_wants='Wants=docker.service\n' if docker else '')
return u
ctx = _cephadm.CephadmContext()
ctx.container_engine = mock_docker()
r = _cephadm.get_unit_file(ctx, '9b9d7609-f4d5-4aba-94c8-effa764d96c9')
- assert 'Requires=docker.service' in r
+ assert 'Wants=docker.service' in r
ctx.container_engine = mock_podman()
r = _cephadm.get_unit_file(ctx, '9b9d7609-f4d5-4aba-94c8-effa764d96c9')
- assert 'Requires=docker.service' not in r
+ assert 'Wants=docker.service' not in r
@mock.patch('cephadm.logger')
def test_attempt_bind(self, _logger):