#node.js #server #cloud #google-cloud-run
# #node.js #сервер #облако #google-cloud-run
Вопрос:
Я добавил Piscina на свой сервер Node JS, локально он работает, но когда я загружаю файл в Google cloud run, он занимает каталог, который я указываю в своем Dockerfile.
В node js я использую:
const piscina = new Piscina({
filename: path.resolve("./") '/workers/send_payment_by_mail_worker.js'
});
const result = piscina.runTask({_data: this.data});
В index.js файл, который я могу использовать:
const piscina = new Piscina({
filename: path.resolve( __dirname '/workers/send_payment_by_mail_worker.js')
});
Который выводит правильное местоположение, в котором находится файл.
В моем dockerfile у меня есть :
FROM node:12.18.1
WORKDIR /
COPY package.json package.json
COPY package-lock.json package-lock.json
RUN npm install
COPY . .
CMD [ "node", "index.js" ]
Google cloud run принимает / в качестве основного каталога. Как вам нужно настроить, чтобы cloud run выбирал правильный каталог файлов для размещения файла для Piscina?
Ошибка, которую я получаю,:
2020-11-27T07:56:31.726607ZError [ERR_MODULE_NOT_FOUND]: Cannot find module '/services/action/workers/send_payment_by_mail_worker.js' imported from /node_modules/piscina/dist/src/worker.js
Default
2020-11-27T07:56:31.726628Z at finalizeResolution (internal/modules/esm/resolve.js:284:11)
Default
2020-11-27T07:56:31.726636Z at moduleResolve (internal/modules/esm/resolve.js:665:10)
Default
2020-11-27T07:56:31.726642Z at Loader.defaultResolve [as _resolve] (internal/modules/esm/resolve.js:755:11)
Default
2020-11-27T07:56:31.726648Z at Loader.resolve (internal/modules/esm/loader.js:97:40)
Default
2020-11-27T07:56:31.726654Z at Loader.getModuleJob (internal/modules/esm/loader.js:243:28)
Default
2020-11-27T07:56:31.726660Z at Loader.import (internal/modules/esm/loader.js:178:28)
Default
2020-11-27T07:56:31.726666Z at importModuleDynamically (internal/modules/cjs/loader.js:1081:27)
Default
2020-11-27T07:56:31.726671Z at exports.importModuleDynamicallyCallback (internal/process/esm_loader.js:37:14)
Default
2020-11-27T07:56:31.726678Z at eval (eval at getImportESM (/node_modules/piscina/dist/src/worker.js:37:27), <anonymous>:1:16)
Default
2020-11-27T07:56:31.726684Z at getHandler (/node_modules/piscina/dist/src/worker.js:58:39)
Default
2020-11-27T07:56:31.726919ZuncaughtException
Комментарии:
1. Не могли бы вы уточнить, что это за ошибка, которую вы получаете, и какая строка кода ее вызывает? Вы упомянули, что это работает локально, вы пробовали запускать образ docker без облачного запуска?
2. Я обновил тикет. Я протестировал это с помощью docker image на localhost, тогда у меня нет проблемы. Нужно ли где-то указывать рабочий каталог? Или как можно найти этот каталог в GCR?
3. Я считаю, что строка
filename: path.resolve("./") '/...worker.js'
должна бытьfilename: path.resolve("./", '/....worker.js')
, там есть дополнительная скобка, я следил за быстрым запуском Cloud run и внизу index.js Я добавил пример кода репозитория piscina readme и работал нормально, мой index.js и worker.js находятся в корневом каталоге, ошибок в облачном запуске нет, если это не скобка, возможночто-то происходит со структурой каталогов, afaik не требуется рабочий каталог в cloud run4. Спасибо, кажется, работает. Есть ли какой-нибудь трюк, чтобы это могло работать и на локальном хосте? Для локального хоста это другой путь (path.resolve(«./») ‘/…worker.js ‘)