#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. Разве копирование всего подобным образом не сводит на нет весь смысл использования многоступенчатой сборки?? Я считаю, что принятый ответ имеет больше смысла.