Имя пути в облаке Google для запуска Piscina

#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 run

4. Спасибо, кажется, работает. Есть ли какой-нибудь трюк, чтобы это могло работать и на локальном хосте? Для локального хоста это другой путь (path.resolve(«./») ‘/…worker.js ‘)