Как мне создать образ docker из приложения Sveltekit

#docker #sveltekit

#docker #sveltekit

Вопрос:

Я пытаюсь создать образ docker из образца приложения, которое я создал в Sveltekit.

Я использую @sveltejs / adapter-auto и включил как файлы .js для вызовов API, так и файлы .svelte в мою папку routes.

Вот мой файл Dockerfile (который отлично работает, но может быть неправильным)

 FROM node:14.15.0 as build

# install dependencies
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci

# Copy all local files into the image.
COPY . .

RUN npm run build

###
# Only copy over the Node pieces we need
# ~> Saves 35MB
###
FROM node:14.15.0

WORKDIR /app
COPY --from=build /app/.svelte-kit/build/. .


EXPOSE 3000
CMD ["node", "./app.js"]
 

Когда я пытаюсь запустить контейнер из образа docker, я получаю сообщение об ошибке

 (node:1) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
/app/app.js:1
import { respond } from '@sveltejs/kit/ssr';
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:979:16)
    at Module._compile (internal/modules/cjs/loader.js:1027:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47
 

Мой package.json содержит "type": "module"

 {
  "name": "backendtest",
  "version": "0.0.1",
  "scripts": {
    "dev": "svelte-kit dev",
    "build": "svelte-kit build",
    "package": "svelte-kit package",
    "preview": "svelte-kit preview",
    "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. .",
    "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. ."
  },
  "devDependencies": {
    "@sveltejs/adapter-auto": "next",
    "@sveltejs/kit": "next",
    "prettier": "^2.4.1",
    "prettier-plugin-svelte": "^2.4.0",
    "svelte": "^3.44.0"
  },
  "type": "module",
  "dependencies": {
    "dotenv": "^10.0.0",
    "mongodb": "^4.2.1"
  }
}

 

Когда я пытаюсь запустить npm run build в своей локальной среде сборки, я получаю сообщение.

 Using @sveltejs/adapter-auto
  Could not detect a supported production environment. See https://kit.svelte.dev/docs#adapters to learn how to configure your app to run on the platform of your choosing
 

Поскольку я новичок в svelte, не уверен, правильно ли это.

Если я пытаюсь использовать адаптер узла, я получаю сообщение об ошибке

 config.kit.adapter should be an object with an "adapt" method. See https://kit.svelte.dev/docs#adapters
Error: config.kit.adapter should be an object with an "adapt" method. See https://kit.svelte.dev/docs#adapters
    at file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:391:12
    at file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:599:43
    at file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:585:18
    at file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:585:18
    at validate_config (file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:739:9)
    at load_config (file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:704:20)
    at async get_config (file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:774:10)
    at async file:///Users/simon/development/svelte/my-app/node_modules/@sveltejs/kit/dist/cli.js:884:18
 

Вот мой svelte.config.js содержание

 import adapter from '@sveltejs/adapter-node';

/** @type {import('@sveltejs/kit').Config} */
const config = {
    kit: {
        adapter: adapter(),

        // hydrate the <div id="svelte"> element in src/app.html
        target: '#svelte'
    }
};

export default config;

 

Я также попробовал следующее svelte.config.js согласно документам github, но получаю ту же ошибку «adapt»

 import adapter from '@sveltejs/adapter-node';

/** @type {import('@sveltejs/kit').Config} */
const config = {
  kit: {
    adapter: adapter({
      // default options are shown
      out: 'build',
      precompress: false,
      env: {
        host: 'HOST',
        port: 'PORT',
      },
    }),
  },
};

export default config;
 

Ответ №1:

Вы должны включить свой package.json в свой окончательный образ Docker.

Редактировать: Также я не уверен, что вам следует использовать .svelte-kit / build, поскольку это промежуточный результат, используемый sveltekit внутренне. У вас должна быть папка сборки после запуска build task, но я не уверен, потому что я никогда не использовал auto adapter, я обычно использую node adapter.

Мой в основном выглядит так:

 COPY --from=build /app/package.json /app/build /.
CMD ["node", "index.js"]
 

Комментарии:

1. Если присмотреться к процессу сборки при запуске в моей среде разработки, после запуска npm run build я получаю следующее сообщение. С помощью @sveltejs / adapter-auto не удалось обнаружить поддерживаемую производственную среду. Смотрите kit.svelte.dev/docs#adapters , чтобы узнать, как настроить ваше приложение для запуска на выбранной вами платформе

2. Я также получаю ошибки, если пытаюсь использовать адаптер узла. Я обновил свой вопрос своими выводами.

3. На что вы настроили свой адаптер при переходе на node, поделитесь конфигурацией, пожалуйста?

4. Я обновил свой вопрос кодом из svelte.config.js в самом низу.

5. Вы установили следующую версию узла адаптера? npm i -D @sveltejs/adapter-node@next

Ответ №2:

Попробуйте скопировать всю папку следующим образом:

 FROM node:14.15.0 as build

# install dependencies
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci

# Copy all local files into the image.
COPY . .

RUN npm run build

###
# Only copy over the Node pieces we need
# ~> Saves 35MB
###
FROM node:14.15.0

WORKDIR /app
COPY --from=build /app .
COPY . .


EXPOSE 3000
CMD ["node", "./app.js"]
 

Комментарии:

1. Спасибо за ваш быстрый ответ, Эмидио

2. Разве копирование всего подобным образом не сводит на нет весь смысл использования многоступенчатой сборки?? Я считаю, что принятый ответ имеет больше смысла.