Сбой компиляции машинописного текста (в Docker), когда NODE_ENV=production

Итак, у меня есть create-react-app-ts приложение, которое я хотел бы докеризовать и разместить на Zeit Now.

Локально все работает отлично, запуск yarn tsc и react-scripts-ts build работает отлично.

Создание образа Docker также отлично работает из следующего Dockerfile:

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....

Таким образом, может показаться, что либо Typescript, либо react-scripts-ts действуют по-разному, когда NODE_ENV=production. Я никогда раньше не сталкивался с этой ошибкой и не знаю, как ее отладить. Запуск NODE_ENV=production tsc или NODE_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"]
}

Любые советы будут высоко ценится! :)

EDIT: добавлены аргументы env var args в Dockerfile. Первоначально это было опущено для краткости, но в итоге это стало частью проблемы и решения.


person jhm    schedule 24.08.2018    source источник
comment
Вероятно, вам следует опубликовать сообщение об ошибке. Исходный код есть на GitHub? У меня есть проект React TS, который вы можете попробовать развернуть и начать добавлять некоторые из ваших пакетов, чтобы увидеть, когда он выйдет из строя. github.com/styfle/react-server-example-tsx   -  person styfle    schedule 24.08.2018


Ответы (1)


Итак, я наконец нашел проблему! В моем исходном Dockerfile NODE_ENV было установлено до yarn 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, так что не беспокойтесь о том, что это раздует вашу сборку. :)

person jhm    schedule 26.08.2018
comment
Это вызвало у меня головную боль на несколько часов. Спасибо! - person BastiBen; 18.11.2019