Docker com API Legacy

Saudações.

Um update recente do Docker descontinuou a API legado (1.24) e restringiu ao uso da versão moderna (1.44+). O resultado foi a quebra de vários serviços que controlavam o Docker, incluindo os importantes Portainer e Traefik.

Esse tutorial/dica apresenta uma forma de resolver de maneira rápida e pontual.

Nota: você só deve aplicar esse tutorial se seu Docker foi atualizado e provocou o problema.

Pré-requisitos (constam em outros artigos aqui do blog):

  • Instalação do Linux (Debian);
  • Internet no servidor;
  • Docker CE instalado;

1 – Conferindo suporte API

Teste se seu Docker foi atualizado e possui o problema:

Bash
# Instalar comadno jq para interpretar JSON no terminal:
apt -y install jq;

# Conferindo config da API
    curl \
        --silent \
        -X GET \
        --unix-socket \
        /run/docker.sock http://localhost/version | jq .;

# Filtrar versoes de API suportadas:
    curl \
        --silent \
        -X GET \
        --unix-socket /run/docker.sock \
        http://localhost/version | jq . | grep -i ApiVersion;

# Conferindo suporte a API nova:
    curl \
        --silent \
        -X GET \
        --unix-socket /run/docker.sock http://localhost/v1.44/version | jq .;

# Conferindo suporte a API legacy:
    curl \
        --silent \
        -X GET \
        --unix-socket /run/docker.sock http://localhost/v1.24/version | jq .;

# Erro ao consultar a v1.24 acima:
    # {
    #   "message": "client version 1.24 is too old.
    #   Minimum supported API version is 1.44,
    #   please upgrade your client to a newer version"
    # }

Se ao consultar a API 1.24 o erro de “please upgrade your client to a newer version“, você precisará aplicar o ajuste abaixo para restaurar os serviços parados.

2 – Ativando API legacy novamente

Será necessário alterar a configuração do Docker no arquivo /etc/docker/daemon.json.

Se este arquivo existe, adicione o parâmetro abaixo no objeto JSON:

JSON
{
    "min-api-version": "1.24"
}

Se o arquivo não existe, use meu script:

Bash
# Criar config inicial do Docker:
if [ -f /etc/docker/daemon.json ]; then
    echo "# daemon.json ja existe, edite-o com seguranca";
else
    echo "# criando daemon.json com suporte API legacy";
    (
        echo '{';
        echo '    "min-api-version": "1.24",';
        echo '    "max-concurrent-uploads": 16,';
        echo '    "max-concurrent-downloads": 16';
        echo '}';
    ) > /etc/docker/daemon.json;
    echo "# concluido";
fi;

Reinicie o Docker:

Bash
# Reiniciar docker:
systemctl restart docker;

Testar se a API legacy foi restaurada:

Bash
# Conferindo suporte a API legacy:
    curl \
        --silent \
        -X GET \
        --unix-socket /run/docker.sock \
        http://localhost/version | jq . | grep -i ApiVersion;

    # Retorno esperado: "MinAPIVersion": "1.24"
    #  "ApiVersion": "1.52",
    #  "MinAPIVersion": "1.24",

Eu arrasei, eu ja sei, de nada!” Autor: Maui

Terminamos por hoje!

Patrick Brandão, patrickbrandao@gmail.com