Ajout d'une solution mise à jour pour l'approche Healthcheck. Extrait simple:
healthcheck:
  test: out=$$(mysqladmin ping -h localhost -P 3306 -u foo 
Explication : Puisque mysqladmin pingrenvoie des faux positifs (en particulier pour un mot de passe incorrect), j'enregistre la sortie dans une variable temporaire, puis j'utilise greppour trouver la sortie attendue (mysqld is alive ). S'il est trouvé, il renverra le code d'erreur 0. Au cas où il ne serait pas trouvé, j'imprime le message entier et je renvoie le code d'erreur 1.
Extrait étendu:
version: "3.8"
services:
  db:
    image: linuxserver/mariadb
    environment:
      - FILE__MYSQL_ROOT_PASSWORD=/run/secrets/mysql_root_password
      - FILE__MYSQL_PASSWORD=/run/secrets/mysql_password
    secrets:
      - mysql_root_password
      - mysql_password
    healthcheck:
      test: out=$$(mysqladmin ping -h localhost -P 3306 -u root 
secrets:
  mysql_root_password:
    file: ${SECRETSDIR}/mysql_root_password
  mysql_password:
    file: ${SECRETSDIR}/mysql_password
Explication : J'utilise des secrets de docker au lieu de variables env (mais cela peut également être réalisé avec des variables d'environnement régulières). L'utilisation de $$est pour littéral$ signe qui est supprimé lorsqu'il est passé au conteneur.
Sortie de docker inspect --format "{{json .State.Health }}" db | jqà diverses occasions:
Tout va bien:
{
  "Status": "healthy",
  "FailingStreak": 0,
  "Log": [
    {
    {
      "Start": "2020-07-20T01:03:02.326287492+03:00",
      "End": "2020-07-20T01:03:02.915911035+03:00",
      "ExitCode": 0,
      "Output": "mysqld is alive\n"
    }
  ]
}
DB n'est pas (encore) en place:
{
  "Status": "starting",
  "FailingStreak": 1,
  "Log": [
    {
      "Start": "2020-07-20T01:02:58.816483336+03:00",
      "End": "2020-07-20T01:02:59.401765146+03:00",
      "ExitCode": 1,
      "Output": "\u0007mysqladmin: connect to server at 'localhost' failed error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 \"No such file or directory\")' Check that mysqld is running and that the socket: '/var/run/mysqld/mysqld.sock' exists!\n"
    }
  ]
}
Mauvais mot de passe:
{
  "Status": "unhealthy",
  "FailingStreak": 13,
  "Log": [
    {
      "Start": "2020-07-20T00:56:34.303714097+03:00",
      "End": "2020-07-20T00:56:34.845972979+03:00",
      "ExitCode": 1,
      "Output": "\u0007mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password: YES)'\n"
    }
  ]
}