Как правильно работать с ошибкой Docker-a "Error while fetching server API version"?
Новичок в Docker. Пытаюсь запустить на Docker-e сборку такого full-stack проекта:
Автоматизация сборки проекта настроена и работает по следующему принципу:
- npm-таск
"Incremental development build"запускает компиляциюEntryPoint-FrontEnd.tsиEntryPoint-Backend.ts; выходные JavaScript-файлы помещаются в01-DevelopmentBuild. - 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-ов, то альтернативные решения приветствуются, при этом:
- Работа таска
"Run server", автоматически перезапускающего Node.js при обновленииEntryPoint-Backend.ts, не должна нарушаться (в режиме локальной разработки). Другими словами, после запускаdocker-compose upникаких перезапусков или пересозданий вручную через консоль быть не должно. - В контейнере не должно быть ничего лишнего, в частности
.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 шт):
Программа docker-compose написана на питоне, а сам docker - на go. Поэтому непонятные ошибки типа File "site-packages\docker\api\client.py" связаны с самой программой.
Как решать такие проблемы:
Проверяем сам докер: выполняем
docker run -it --rm node:12.4 node --versionили более стандартную проверку Hello worlddocker run -it --rm hello-world- исключаем сам докерДелаем минимальный тест для проверки
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 - не сильно ли она устарела
