tox-docker icon indicating copy to clipboard operation
tox-docker copied to clipboard

Container never becomes healthy

Open WhyNotHugo opened this issue 3 years ago • 1 comments

I'm using this code on my tox.ini:

[docker:postgres]
image=postgres:13
environment=
  POSTGRES_PASSWORD=postgres
ports=5432:5432/tcp
healthcheck_cmd = pg_isready --username postgres
healthcheck_retries = 30
healthcheck_timeout = 1
healthcheck_interval = 1
healthcheck_start_period = 1

And the container is never reported as healthy:

django32-postgres docker: run 'postgres:13' (from 'postgres')
django32-postgres docker: health check 'docker.io/library/postgres:13' (from 'postgres')
django32-postgres docker: leave 'f45481a0ec' (from 'postgres') running
___________________________________________________________________ summary ___________________________________________________________________
ERROR:   django32-postgres: 'docker.io/library/postgres:13' (from 'postgres') failed health check
Traceback (most recent call last):
  File "/usr/bin/tox", line 33, in <module>
    sys.exit(load_entry_point('tox==3.24.1', 'console_scripts', 'tox')())
  File "/usr/lib/python3.9/site-packages/tox/session/__init__.py", line 44, in cmdline
    main(args)
  File "/usr/lib/python3.9/site-packages/tox/session/__init__.py", line 69, in main
    exit_code = session.runcommand()
  File "/usr/lib/python3.9/site-packages/tox/session/__init__.py", line 197, in runcommand
    return self.subcommand_test()
  File "/usr/lib/python3.9/site-packages/tox/session/__init__.py", line 225, in subcommand_test
    run_sequential(self.config, self.venv_dict)
  File "/usr/lib/python3.9/site-packages/tox/session/commands/run/sequential.py", line 22, in run_sequential
    runtestenv(venv, config)
  File "/usr/lib/python3.9/site-packages/tox/session/commands/run/sequential.py", line 73, in runtestenv
    config.pluginmanager.hook.tox_runtest_pre(venv=venv)
  File "/usr/lib/python3.9/site-packages/pluggy/hooks.py", line 286, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
  File "/usr/lib/python3.9/site-packages/pluggy/manager.py", line 93, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/usr/lib/python3.9/site-packages/pluggy/manager.py", line 84, in <lambda>
    self._inner_hookexec = lambda hook, methods, kwargs: hook.multicall(
  File "/usr/lib/python3.9/site-packages/pluggy/callers.py", line 208, in _multicall
    return outcome.get_result()
  File "/usr/lib/python3.9/site-packages/pluggy/callers.py", line 80, in get_result
    raise ex[1].with_traceback(ex[2])
  File "/usr/lib/python3.9/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
  File "/usr/lib/python3.9/site-packages/tox_docker/__init__.py", line 338, in tox_runtest_pre
    raise HealthCheckFailed(msg)
tox_docker.HealthCheckFailed: 'docker.io/library/postgres:13' (from 'postgres') failed health check

Here's the output of docker inspect...:

[
    {
        "Id": "c1caad714f8e91bd9e4b352dcaac9ed91cde2f4a68fc674b65928cebb5f5239c",
        "Created": "2021-08-08T09:54:23.783351188Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "postgres"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 1331140,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-08-08T09:54:24.008813678Z",
            "FinishedAt": "0001-01-01T00:00:00Z",
            "Health": {
                "Status": "starting",
                "FailingStreak": 15,
                "Log": [
                    {
                        "Start": "2021-08-08T11:54:47.42803867+02:00",
                        "End": "2021-08-08T11:54:47.544048527+02:00",
                        "ExitCode": 1,
                        "Output": ""
                    },
                    {
                        "Start": "2021-08-08T11:54:49.432903825+02:00",
                        "End": "2021-08-08T11:54:49.505735305+02:00",
                        "ExitCode": 1,
                        "Output": ""
                    },
                    {
                        "Start": "2021-08-08T11:54:51.467404167+02:00",
                        "End": "2021-08-08T11:54:51.542379598+02:00",
                        "ExitCode": 1,
                        "Output": ""
                    },
                    {
                        "Start": "2021-08-08T11:54:53.471339031+02:00",
                        "End": "2021-08-08T11:54:53.583864832+02:00",
                        "ExitCode": 1,
                        "Output": ""
                    },
                    {
                        "Start": "2021-08-08T11:54:55.410558807+02:00",
                        "End": "2021-08-08T11:54:55.486763581+02:00",
                        "ExitCode": 1,
                        "Output": ""
                    }
                ]
            }
        },
        "Image": "docker.io/library/postgres:13",
        "ResolvConfPath": "/run/user/1000/containers/overlay-containers/c1caad714f8e91bd9e4b352dcaac9ed91cde2f4a68fc674b65928cebb5f5239c/userdata/resolv.conf",
        "HostnamePath": "/run/user/1000/containers/overlay-containers/c1caad714f8e91bd9e4b352dcaac9ed91cde2f4a68fc674b65928cebb5f5239c/userdata/hostname",
        "HostsPath": "/run/user/1000/containers/overlay-containers/c1caad714f8e91bd9e4b352dcaac9ed91cde2f4a68fc674b65928cebb5f5239c/userdata/hosts",
        "LogPath": "/home/hugo/.local/share/containers/storage/overlay-containers/c1caad714f8e91bd9e4b352dcaac9ed91cde2f4a68fc674b65928cebb5f5239c/userdata/ctr.log",
        "Name": "/postgres",
        "RestartCount": 0,
        "Driver": "overlay",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": [],
        "HostConfig": {
            "Binds": [
                "879868bc4ed36c9ddb38b16222bebabe2ce48ac60dc55ca97d739b17ee3354ea:/var/lib/postgresql/data:rprivate,rw,nodev,exec,nosuid,rbind"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": null
            },
            "NetworkMode": "slirp4netns",
            "PortBindings": {
                "5432/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "5432"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": [],
            "CapDrop": [
                "AUDIT_WRITE",
                "MKNOD",
                "NET_RAW"
            ],
            "CgroupnsMode": "",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": [],
            "GroupAdd": [],
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "private",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": [],
            "UTSMode": "private",
            "UsernsMode": "",
            "ShmSize": 65536000,
            "Runtime": "oci",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "user.slice",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": 0,
            "OomKillDisable": false,
            "PidsLimit": 2048,
            "Ulimits": [],
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": null,
            "ReadonlyPaths": null
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/home/hugo/.local/share/containers/storage/overlay/35591b3f3bea9079c011da63b1a129b81957a3631ff2ce4ac6e892af82255bdf/diff:/home/hugo/.local/share/containers/storage/overlay/ceb052db2a6c7d55a47c596c811138e02ee2d9a814481098350de9c1f16f3264/diff:/home/hugo/.local/share/containers/storage/overlay/3ac859ffc5aa6ce7e61b219946484f1369aba3009104eaa31764b28711383702/diff:/home/hugo/.local/share/containers/storage/overlay/3b4d7cd67336eed72526a139f0a353eef25cb6d090388bac0d9a0cdff34b2998/diff:/home/hugo/.local/share/containers/storage/overlay/5a10d6774b8456893ebc3f3a2ef05ccfdfae0a260b7777f921c2de586dbdb6e8/diff:/home/hugo/.local/share/containers/storage/overlay/feb8c65ded5e1ae41255dac9afa61bcb6dc4587f9111e64f4198cf5406e38eb9/diff:/home/hugo/.local/share/containers/storage/overlay/06b049fc1e45f8ab6160f1639d4ffd0e8477f8a7841cfd54ae338a113320d7fc/diff:/home/hugo/.local/share/containers/storage/overlay/52ce6081a1d204b1a757e3ecfcd69011261d9d8a43ea33113809b5db0bbb9827/diff:/home/hugo/.local/share/containers/storage/overlay/194f232660e3a1749dd620b226d1815ad95697ab35c5726fc5d1cbacacd8818d/diff:/home/hugo/.local/share/containers/storage/overlay/63d68fc67685c412bff4fd6e89f0c7db1e7bfd6512ef8f2243955d8d8fe9cf0a/diff:/home/hugo/.local/share/containers/storage/overlay/cd3d341c687e1bfa84a81c4e38ca59f9925790c71804701e5c98a564363c387f/diff:/home/hugo/.local/share/containers/storage/overlay/f2640ac368df8cfd4af9ecc847a3782830026f13da54a5b6539633745810e167/diff:/home/hugo/.local/share/containers/storage/overlay/814bff7343242acfd20a2c841e041dd57c50f0cf844d4abd2329f78b992197f4/diff",
                "MergedDir": "/home/hugo/.local/share/containers/storage/overlay/229dd015c29dede04b0cb157a15b013dcd28ecf3e4bf170543895018c05581be/merged",
                "UpperDir": "/home/hugo/.local/share/containers/storage/overlay/229dd015c29dede04b0cb157a15b013dcd28ecf3e4bf170543895018c05581be/diff",
                "WorkDir": "/home/hugo/.local/share/containers/storage/overlay/229dd015c29dede04b0cb157a15b013dcd28ecf3e4bf170543895018c05581be/work"
            },
            "Name": "overlay"
        },
        "SizeRootFs": 0,
        "Mounts": [
            {
                "Type": "volume",
                "Name": "879868bc4ed36c9ddb38b16222bebabe2ce48ac60dc55ca97d739b17ee3354ea",
                "Source": "/home/hugo/.local/share/containers/storage/volumes/879868bc4ed36c9ddb38b16222bebabe2ce48ac60dc55ca97d739b17ee3354ea/_data",
                "Destination": "/var/lib/postgresql/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "Config": {
            "Hostname": "c1caad714f8e",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "5432/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/postgresql/13/bin",
                "TERM=xterm",
                "container=podman",
                "PG_MAJOR=13",
                "PG_VERSION=13.3-1.pgdg100+1",
                "GOSU_VERSION=1.12",
                "LANG=en_US.utf8",
                "PGDATA=/var/lib/postgresql/data",
                "POSTGRES_PASSWORD=postgres",
                "HOME=/root",
                "HOSTNAME=c1caad714f8e"
            ],
            "Cmd": [
                "postgres"
            ],
            "Image": "docker.io/library/postgres:13",
            "Volumes": null,
            "WorkingDir": "/",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "tox_docker_container_name": "postgres"
            },
            "StopSignal": "2",
            "StopTimeout": 0
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "5432/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "5432"
                    }
                ]
            },
            "SandboxKey": "/run/user/1000/netns/cni-262db29d-76da-0e2a-36d0-7e1968570ad6",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {}
        }
    }
]

Using docker exec -it c1 pg_isready --username postgres exits zero. (and prints /var/run/postgresql:5432 - accepting connections).

Any ideas what I'm doing wrong?

WhyNotHugo avatar Aug 08 '21 09:08 WhyNotHugo

Maybe you need to specify the full path to pg_isready? I'm not sure what PATH exists when health checks are run (possibly it's empty).

If that fails, you could try docker run -e POSTGRES_PASSWORD=postgres -t -i --health-start-period 1s --health-interval 1s --health-timeout 1s --health-retries 30 --health-cmd "pg_isready --username postgres" postgres:13 to debug...

That should be equivalent to what tox-docker is running.

dcrosta avatar Aug 08 '21 11:08 dcrosta