Просят установить Typescript, когда он уже установлен при сборке Docker образа - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь создать docker образ приложения Next.js / React, которое использует Typescript.

Typescript установлен, и я могу запустить сборку локально без docker.

Однако, поскольку образ docker создается, я дохожу до следующего:

Step 8/10 : RUN npm run build
 ---> Running in ee577c719739

> project@0.0.5 build /app
> next build

Creating an optimized production build...
Attention: Next.js now collects completely anonymous telemetry regarding usage.
This information is used to shape Next.js' roadmap and prioritize features.
You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL:
https://nextjs.org/telemetry

It looks like you're trying to use TypeScript but do not have the required package(s) installed.

Please install typescript by running:

        npm install --save-dev typescript

If you are not trying to use TypeScript, please remove the tsconfig.json file from your package root (and any TypeScript files).

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! project@0.0.5 build: `next build`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the project@0.0.5 build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

Я уже установил Typescript. Это очень смущает меня.

Используемое мной изображение Docker выглядит следующим образом:

FROM gcr.io/companyX/companyX-node-base:12-alpine

# Copy in the project files
COPY . .

# Clean
USER root
RUN rm -fr node_modules

ENV NODE_ENV=production

COPY package*.json ./

RUN npm install && \
    npm cache clean --force

RUN npm run build

EXPOSE 3000

# Running the app
CMD [ "npm", "start" ]

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Когда вы запускаете (даже вне Docker)

export NODE_ENV=production
npm install

, он устанавливает dependencies только с вашего package.json, а не devDependencies. С другой стороны, вам, вероятно, понадобится devDependencies, чтобы получить такие инструменты, как typescript.

. Хорошим решением здесь является использование многоэтапной сборки. На первом этапе устанавливаются все зависимостей; второй этап копирует только то, что необходимо для запуска приложения.

FROM gcr.io/companyX/companyX-node-base:12-alpine AS build

# Copy in only the parts needed to install dependencies
# (This avoids rebuilds if the package.json hasn’t changed)
COPY package.json package.lock .

# Install dependencies (including dev dependencies)
RUN npm install

# Copy in the rest of the project
# (include node_modules in a .dockerignore file)
COPY . .

# Build the project
RUN npm run build

# Second stage: runtime
FROM gcr.io/companyX/companyX-node-base:12-alpine

ENV NODE_ENV=production

# Again get dependencies, but this time only install
# runtime dependencies
COPY package.json package.lock .
RUN npm install

# Get the built application from the first stage
COPY --from=build /app/dist dist

# Set runtime metadata
EXPOSE 3000
CMD [ "npm", "start" ]
# CMD ["node", "dist/index.js"]

Обратите внимание, что этот подход не совместим с настройками, которые перезаписывают содержимое приложения произвольным содержимым с хоста или которые пытаются хранить библиотеки в Docker томах. Конечное изображение является автономным и не требует содержимого хоста, и может быть запущено как есть на других системах без отдельного копирования исходного кода.

1 голос
/ 10 января 2020

Кредит @Ahmed Rebai

Пришлось вручную добавить машинописный текст в зависимости в файле Package. json. Обычная установка npm только добавит его в dev.

...