Как правильно работать с ошибкой Docker-a "Error while fetching server API version"?

Новичок в Docker. Пытаюсь запустить на Docker-e сборку такого full-stack проекта:

введите сюда описание изображения

Автоматизация сборки проекта настроена и работает по следующему принципу:

  1. npm-таск "Incremental development build" запускает компиляцию EntryPoint-FrontEnd.ts и EntryPoint-Backend.ts; выходные JavaScript-файлы помещаются в 01-DevelopmentBuild.
  2. npm-таск "Run server" запускает откомпилированный скрипт EntryPoint-Backend.js, причём при изменении этого файла скрипт будет перезапущен.

Если в терминале появится сообщение Приложение стартовало, порт XXX доступен для прослушки., значит всё прошло успешно. На всякий случай приведу листинг EntryPoint-Backend.ts:

import Express, {
  Application as ExpressApplication
} from "express";
import RequestBodyParser from "body-parser";

import authenticationRoutes from "./Routes/AuthenticationRoutes";


(function executeApplication(): void {

  const expressApplication: ExpressApplication = Express()
      .use(RequestBodyParser.urlencoded({ extended: true }))
      .use(RequestBodyParser.json());

  const DEFAULT_PORT: number = 5000;
  const port: number = typeof process.env.port === "undefined" ? DEFAULT_PORT : Number(process.env.port);

  expressApplication.use("/api/auth", authenticationRoutes);

  expressApplication.listen(port, () => {
    console.log(`Приложение стартовало, порт ${port} доступен для прослушки.`);
  });
})();

Без Docker-а всё работает прекрасно, но следующим шагом в данном проекте будет добавление базы данных без её локальной установки на компьютер. Тут и понадобится Docker, но и EntryPoint-Backend.ts тоже нужно будет запустить в контейнере (во всяком случае, нужно уметь это делать).

Я видел самые разные настройки Docker, но поскольку большую их часть я не понимаю, то начал с такого минимального docker-compose.yaml:

version: "3"

services:

  logic:
    image: node:12.4
    command: npm run 'Incremental development build' && npm run 'Run server'
    volumes:
      - ./01-DevelopmentBuild:/Application
  • В будущем в этот же файл я добавлю сервис базы данных; судя по всему обойтись без лишних Dockerfile возможно и прописать всё нужное в docker-compose.yaml возможно.

  • Если Вы хотите раскритиковать использование Volum-ов, то альтернативные решения приветствуются, при этом:

    1. Работа таска "Run server", автоматически перезапускающего Node.js при обновлении EntryPoint-Backend.ts, не должна нарушаться (в режиме локальной разработки). Другими словами, после запуска docker-compose up никаких перезапусков или пересозданий вручную через консоль быть не должно.
    2. В контейнере не должно быть ничего лишнего, в частности .ts-файлов и всех файлов под node_modules на картинке выше.
  • В настройке отсутствует указание портов. Насколько я видел, если не указать порт, то Docker не упадёт, потому отложил указание портов на потом (но Вы можете их указать в решении).

Ошибка при запуске docker-compose up возникает такая:

D:\IntelliJ IDEA\InHouseDevelopment\ProjectsForFunctionalTesting\FullStackWebApplication-NodeJS>docker-compose up
Traceback (most recent call last):
  File "site-packages\docker\api\client.py", line 205, in _retrieve_server_version
  File "site-packages\docker\api\daemon.py", line 181, in version
  File "site-packages\docker\utils\decorators.py", line 46, in inner
  File "site-packages\docker\api\client.py", line 228, in _get
  File "site-packages\requests\sessions.py", line 543, in get
  File "site-packages\requests\sessions.py", line 530, in request
  File "site-packages\requests\sessions.py", line 643, in send
  File "site-packages\requests\adapters.py", line 449, in send
  File "site-packages\urllib3\connectionpool.py", line 677, in urlopen
  File "site-packages\urllib3\connectionpool.py", line 392, in _make_request
  File "http\client.py", line 1244, in request
  File "http\client.py", line 1290, in _send_request
  File "http\client.py", line 1239, in endheaders
  File "http\client.py", line 1026, in _send_output
  File "http\client.py", line 966, in send
  File "site-packages\docker\transport\npipeconn.py", line 32, in connect
  File "site-packages\docker\transport\npipesocket.py", line 23, in wrapped
  File "site-packages\docker\transport\npipesocket.py", line 72, in connect
  File "site-packages\docker\transport\npipesocket.py", line 59, in connect
pywintypes.error: (2, 'CreateFile', 'Specified file not found')

[48560] Failed to execute script docker-compose

Ошибка Specified file not found - это я перевёл автоматически локализованное сообщение на английский; оригинал сообщения не английском и не на русском. В остальном ничего не понятно; большая часть сообщений об ошибке - какие-то пути к .py-файлам, которые неизвестно какое отношение к моему проекту имеют. О каком файле вообще идёт речь в (2, 'CreateFile'?

Но поскольку за разъяснением каждой ошибки я бегать на StackOverflow не буду, то основной вопрос у меня такой: как правильно работать с подобными ошибками? Где искать подсказки, указывающие на причину и потенциальные решения?


Ответы (1 шт):

Автор решения: Total Pusher

Программа docker-compose написана на питоне, а сам docker - на go. Поэтому непонятные ошибки типа File "site-packages\docker\api\client.py" связаны с самой программой.

Как решать такие проблемы:

  1. Проверяем сам докер: выполняем docker run -it --rm node:12.4 node --version или более стандартную проверку Hello world docker run -it --rm hello-world - исключаем сам докер

  2. Делаем минимальный тест для проверки docker-compose и запускаем через docker-compose up:

version: "3"

services:

  logic:
    image: node:12.4
    command: npm --version

Этот тест 100% рабочий, поэтому, если нет проблем с docker-compose, он должен пройти.

Вообще, ошибки docker-compose мало информативные, в ошибках только стек вызовов. Я попробовал искать по сорцам File "site-packages\docker\api\client.py", line 205, in _retrieve_server_version - нет ни файла client.py, ни _retrieve_server_version. Почему не нашел - не знаю, может быть у вас более старая версия. Если бы нашел, то по исходному коду можно было бы понять, что не так.

С какими ошибками я сталкивался:

  • не запущен докер-демон, проверяется через sudo service dockerd status (для винды аналогичную команду я не знаю) - я сильно подозревал именно это
  • повреждены файлы на диске - это была самая трудно диагностируемая ошибка для меня, определил я ее путем сравнивания md5-хешей файла докера и аналогичного из дистрибутива (md5sum /usr/bin/docker). Ошибка была в docker, хотя казалось, что виноват docker-compose, он выдавал также стек вызовов
  • не совместимы версии программ docker и docker-compose - эти программы ставятся отдельно друг от друга, начните с проверки версии docker - не сильно ли она устарела
→ Ссылка