所以我有一个 create-react-app-ts 应用程序,我想在 Zeit Now 上对其进行 Dockerize 和托管。

在本地一切正常,运行 yarn tscreact-scripts-ts build 效果很好。

从以下 Dockerfile 创建 Docker 镜像也很有效:

FROM mhart/alpine-node:10.9
WORKDIR /usr/src

ARG REACT_APP_API_ENDPOINT
ARG NODE_ENV

COPY yarn.lock package.json ./
RUN yarn

COPY . .
RUN yarn build && mv build /public

但是,发布到 Now 时,构建脚本在 Typescript 编译时失败,为项目中的大多数文件输出编译错误。

如果我在 ENV NODE_ENV production 上方的 Dockerfile 中设置 WORKDIR... ,我也可以在本地重现它。

因此,当 react-scripts-ts 时,Typescript 或 NODE_ENV=production 的行为似乎有所不同。我以前从来没有遇到过这个错误,我不知道如何调试它。运行 NODE_ENV=production tscNODE_ENV=production react-scripts-ts build 在本地也能正常工作。

我正在使用以下配置运行 Typescript v 3.0.1:
{
  "compilerOptions": {
    "baseUrl": ".",
    "outDir": "build/dist",
    "module": "esnext",
    "target": "es6",
    "lib": ["es6", "dom", "esnext.asynciterable"],
    "sourceMap": true,
    "allowJs": true,
    "jsx": "react",
    "moduleResolution": "node",
    "rootDir": "src",
    "forceConsistentCasingInFileNames": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "suppressImplicitAnyIndexErrors": true,
    "noUnusedLocals": true,
    "allowSyntheticDefaultImports": true,
    "strict": true
  },
  "exclude": ["node_modules", "build", "scripts", "acceptance-tests", "webpack", "jest", "src/setupTests.ts"]
}

任何建议将不胜感激! :)

编辑 :将 env var args 添加到 Dockerfile。为了简洁起见,它最初被省略了,但它最终成为问题和解决方案的一部分

最佳答案

所以我终于找到了问题所在!在我原来的 Dockerfile 中, NODE_ENVyarn install 之前被设置为 。这意味着对于生产构建, yarn 不会安装 devDependencies ,因此也不会安装我的任何 @types 库。这导致了整个项目的所有编译错误。

NODE_ENV 中的
yarn install 下面/之后移动 Dockerfile 的定义解决了这个问题。

FROM mhart/alpine-node:10.9
WORKDIR /usr/src

COPY yarn.lock package.json ./
RUN yarn

ARG REACT_APP_API_ENDPOINT
ARG NODE_ENV

COPY . .
RUN yarn build && mv build /public

注意:据我所知,yarn build 会确保再次删除 devDependencies,所以不要担心这会增加你的构建。 :)

关于当 NODE_ENV=production 时,Typescript 编译失败(在 Docker 中),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52007806/

10-12 03:22