Docker 和 Babel 的 gcloud App Engine Flexible Strangeness

gcloud App Engine Flexible Strangeness with Docker and Babel

几个月来,我一直在将服务器端节点应用程序部署到自定义应用程序引擎 运行,没有任何问题。关于它的唯一有趣的事情是 运行 在我构建容器时针对源代码的 babel。

在过去的几周里,这一直间歇性地失败,并在远程构建日志中出现与此相关的错误。

import * as deps from './AppFactory';
SyntaxError: Unexpected token import

让我相信 babel 转译并没有发生;虽然 gcloud cli 表明它是:

> node_modules/babel-cli/bin/babel.js src/ -d dist/

src/AppFactory.js -> dist/AppFactory.js
src/Ddl.js -> dist/Ddl.js
src/Helpers.js -> dist/Helpers.js
src/MemoryResolver.js -> dist/MemoryResolver.js
src/Mysql.js -> dist/Mysql.js
src/Schema.js -> dist/Schema.js
src/index.js -> dist/index.js
 ---> 0282c805d5c9

无奈之下我把Dockerfile中的dist/index文件搞出来了。当我这样做时,我发现确实没有发生转译。

当我在本地创建 docker 图像时,一切正常。

我的 Dockerfile 如下:

# Set the base image to Ubuntu
FROM    gcr.io/google_appengine/nodejs:latest

ENV NODE_ENV production

# File Author / Maintainer
# Provides cached layer for node_modules
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /src && cp -a /tmp/node_modules /src/

# Define working directory
WORKDIR /src
ADD . /src

RUN npm run deploy
RUN cat /src/dist/index.js

CMD ["npm", "start"]

下面是我的 .babelrc 文件:

{
  "presets": [
    "es2015",
  ]
}

还有我的原版 yaml 文件:

service: metrics-api-test
runtime: custom
env: flex
env_variables:
  NODE_ENV: 'production'
  NODEPORT: '8080'
beta_settings:
  cloud_sql_instances: pwc-sales-demos:us-east1:pawc-sales-demos-sql

我一直在尝试使用 babel-register、babel-node 进行各种变体。当我构建本地 docker 图像时,它们都能完美运行。当我部署到应用引擎时,它们都失败了。

几个月前我发布了这个问题,这个问题又开始困扰我了。它开始时是间歇性问题,现在每次都会发生。它发生在服务之间,甚至发生在不同的 gcloud 项目上。

对此的任何见解都会得到我的赞赏和 150 分。

终于回到这个话题了;这完全是我的错。

我原以为我已经将所有 babel 依赖项移动到运行时依赖项 strophe 中,如下所示:

"dependencies": {
    "babel-cli": "^6.24.1",
    "babel-preset-es2015": "^6.24.1"....

但我一定没有。一切都与上面和这个 Dockerfile 完美配合:

FROM    gcr.io/google_appengine/nodejs:latest

ENV NODE_ENV production

# File Author / Maintainer
# Provides cached layer for node_modules
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /src && cp -a /tmp/node_modules /src/

# Define working directory
WORKDIR /src
ADD . /src

RUN node_modules/babel-cli/bin/babel.js src/ -d dist/
RUN cat dist/index.js
CMD ["npm", "start"]

不再手动构建文件!