Cloud Run: образ контейнера создается, но сервер Koa не запускается - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть сервер, который работает нормально локально, но не в облачной среде.

Deploying container to Cloud Run service [testserver] in project [buyusedshopify] region [us-central1]
X Deploying... Cloud Run error: Container failed to start. Failed to start and then listen 
on the port defined by the PORT environment variable. Logs for this revision might contain 
more information.                                                                          
  X Creating Revision... Cloud Run error: Container failed to start. Failed to start and th
  en listen on the port defined by the PORT environment variable. Logs for this revision mi
  ght contain more information.                                                            
  . Routing traffic...                                                                     
Deployment failed                                                                          
ERROR: (gcloud.run.deploy) Cloud Run error: Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable. Logs for this revision might contain more information.

Мой Dockerfile:

FROM node:12-slim

# Create app folder
WORKDIR /usr/src/app

# Install app deps. Copy the lock file
COPY package*.json ./
RUN npm install

ENV SCOPES=read_products,write_products,unauthenticated_read_product_listings \
    SHOPIFY_API_KEY=removed \
    SHOPIFY_API_SECRET=removed \
    CLIENT_APP_URL=placeholder

COPY build ./
CMD ["node", "server.js"]

пакет. json

"buildImage": "gcloud builds submit --tag gcr.io/buyusedshopify/testserver",
"deployCloudRun": "gcloud run deploy --image gcr.io/buyusedshopify/testserver --platform managed",
"buildAndDeploy": "npm run buildImage && npm run deployCloudRun",

Здесь находится файл server.ts внутри src, который компилируется в . js эквивалент

import path from "path";
require("dotenv").config();
console.log(process.env, `=====process.env=====`);

import Koa from "koa";
import Router from "koa-router";
import session from "koa-session";
import authorizeForShopify, {verifyRequest} from "@shopify/koa-shopify-auth";

const koa = new Koa();
const router = new Router();

const {SHOPIFY_BUYUSED_API_KEY, SHOPIFY_BUYUSED_API_SECRET, SHOPIFY_BUYUSED_SCOPES} = process.env;

koa.keys = [SHOPIFY_BUYUSED_API_SECRET];
koa.use(session({secure: true, sameSite: "none"}, koa));


koa.use(authorizeForShopify({
  apiKey : SHOPIFY_BUYUSED_API_KEY
  , secret : SHOPIFY_BUYUSED_API_SECRET
  , scopes : SHOPIFY_BUYUSED_SCOPES.split(",")
  , afterAuth(ctx: Koa.Context): void {
    console.log(`=====inside afterAuth()=====`);
    const {shop, accessToken} = ctx.session;

    console.log({
      message : "from inside afterAuth()"
      , shop
      , accessToken
    });

    ctx.redirect("/");
  }
}));


router.get('/', async ctx => {
  ctx.body = "Koa server running, '/' route triggered"
});

router.get('/2nd', async ctx => {
  ctx.response.body = "2nd route message";
});

////// Protected Routes //////
koa.use(verifyRequest());



koa.use(router.routes())
  .use(router.allowedMethods());

const port: number = Number(process.env.PORT) || 3000;

koa.listen(port, undefined, undefined, () => console.log(`=====Koa listening on port ${port.toString()}=====`));

Есть идеи в чем проблема? Он работал раньше, когда сводился к одному маршруту, а затем к методу прослушивания. С тех пор я добавил связанные с shopify библиотеки, несколько маршрутов и dotenv для локальной обработки env.

Примечания

  1. build не используется .gitignored , Для Dockerfile или облака Google нет файла игнорирования. Я только .gitignore ing node_modules, .idea и .env
  2. Я использую npm скрипт buildAndDeploy. Сборка всегда работает, развертывание в Cloud Run всегда дает сбой.

Также пробовал

COPY build ./ // in Dockerfile CMD ["node", "build/server.js"] (при использовании вышеуказанной команды COPY)

Редактировать

Комментарии и соответствующий пост SO рекомендовали установить переменную PORT на 8080.

Я сделаю это как запасной вариант, но проверю свои опубликованные В приведенном ниже решении вы можете увидеть фактическую ошибку в конфигурации Dockerfile в операторах COPY и CMD. Были также проблемы с переменными Env из-за того, что в Dockerfile не отображались обновленные имена в .env.

1 Ответ

2 голосов
/ 05 февраля 2020

Было внесено три изменения:

  1. Имена переменных Env были изменены в .env, но не обновлены в Dockerfile, исправлено
  2. COPY build ./ должно быть COPY build ./build для зеркального отображения локальных путей.
  3. Я изменил команду сценария на CMD ["node", "build/server.js] для учета перемещения файла из оператора COPY.

С этими тремя исправлениями конфигурация сервера должна зеркало localhost. Он был успешно развернут в Cloud Run.

...