.NET Core Docker Image для приложений SPA
Какое правильное изображение Docker используется при создании нового приложения ASP.NET Core MVC, в частности, с помощью шаблона React/Redux (или другого Node.js)? Если не конкретное изображение, какие команды или процесс должны выполняться в файле Docker для приложения Node.js, поддерживаемого ASP.NET Core MVC?
Я не требую SDK-версии фреймворка для чего-либо другого, кроме запуска резервного MVC-сайта.
dotnet new reactredux
Изображение во время выполнения не установлено Node.js и будет ошибкой при попытке запустить контейнер.
Dockerfile:
FROM microsoft/aspnetcore:latest
ARG source=./bin/Debug/netcoreapp2.0/publish/
WORKDIR /app
COPY $source .
EXPOSE 80
ENTRYPOINT ["dotnet", "Project.dll"]
Ошибка:
Unhandled Exception: System.AggregateException: One or more errors occurred. (Failed to start Node process. To resolve this:.
[1] Ensure that Node.js is installed and can be found in one of the PATH directories.
Current PATH enviroment variable is: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Make sure the Node executable is in one of those directories, or update your PATH.
Проект, с которым я работаю, обновляется с ASP.NET MVC для .NET Standard 1.1 (автономный) до нового проекта .NET Standard 2.0 React/Redux.
Ответы
Ответ 1
Проблема заключается в том, что базовое изображение в вашем файле dockerfile (microsoft/aspnetcore: latest) не содержит node.
Итак, вам нужно установить node, чтобы вы могли запускать проект. Это докер файл, с которым я пришел:
FROM microsoft/aspnetcore:2.0
ARG source
EXPOSE 80 5102
ENV ASPNETCORE_URLS http://*:80
RUN apt-get -qq update && apt-get -qqy --no-install-recommends install wget gnupg \
git \
unzip
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -
RUN apt-get install -y nodejs
WORKDIR /app
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "Project.dll"]
Обратите внимание, как в строке 5 файла docker я запускаю команду для обновления apt-get. И затем в строке 8-9 node устанавливается на изображение докеры
По-прежнему существует проблема, замена горячего модуля из webpack не работает. Даже полное обновление не работает. Я все еще смотрю на него.
UPDATE:
поэтому я рассмотрел проблему замены горячего модуля и, по-видимому, это ограничение докера для окон.
Обходной путь заключается в настройке webpack, чтобы он мог сообщать обозревателю об изменениях в течение определенного времени. Посмотрите эту ссылку, чтобы узнать, как ее настроить
UPDATE:
Сделав немного больше исследований, я узнал, что у microsoft есть образ, который вы можете использовать для создания своего проекта, он называется: microsoft/aspnetcore-build. Это изображение имеет все зависимости, необходимые для построения (включая nodejs).
Итак, в конце концов, я оставил свой файл Docker как есть (с microsoft/aspnetcore: 2.0 в качестве базового образа) и создал новый файл Docker для разработки, который ссылается на образ сборки, о котором я упоминал ранее. С помощью docker compose я переключаю Dockerfiles в зависимости от среды.
Этот подход кажется более удобным, потому что, когда образы развертываются в производственной среде, они должны иметь все готовые javascript-коды (в случае спа-приложения с angular 2, реагировать и т.д.), другими словами, они не должны иметь зависимость nodejs, делая их менее тяжелыми по размеру.
Ответ 2
Основываясь на ответе @Daniels выше, используя Visual Studio 2017 v15.4 и ASP.NET Core 2.0 на Docker, вот изменения, которые необходимо внести, чтобы обеспечить правильное поведение Production and Development для приложений SPA (в моем случае я " m с помощью Angular):
-
Добавить новый файл Docker в ваш проект, который является копией оригинала. Давайте назовем его Dockerfile.Development. Измените следующим образом:
FROM microsoft/aspnetcore:2.0
ARG source
# BEGIN MODIFICATION - Node is needed for development (but not production)
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -
RUN apt-get install --assume-yes nodejs
# END MODIFICATION
WORKDIR /app
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "MyService.dll"]
-
Измените файл docker-compose.override.yml в своем решении, чтобы использовать этот новый файл докеров в разработке. Это будет выглядеть примерно так:
version: '3'
services:
myservice:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "80"
build:
dockerfile: Dockerfile.Development
-
Измените файл webpack.config.js в вашем проекте, чтобы включить просмотр изменений, как показано ниже:
const clientBundleConfig = merge(sharedConfig, {
entry: { 'main-client': './ClientApp/boot.browser.ts' },
output: { path: path.join(__dirname, clientBundleOutputDir) },
// BEGIN MODIFICATION
watch: isDevBuild,
watchOptions: {
poll: isDevBuild ? 1000 : false
},
// END MODIFICATION
plugins: [
new webpack.DllReferencePlugin({
context: __dirname,
manifest: require('./wwwroot/dist/vendor-manifest.json')
})
].concat(isDevBuild ? [
Ответ 3
Если вам нужно добавить только двоичный код node
к вашему изображению, вы можете скопировать то, что делает файл dockerfile microsoft/aspnetcore-build
:
ENV NODE_VERSION 6.10.3
RUN set -ex \
&& for key in \
9554F04D7259F04124DE6B476D5A82AC7E37093B \
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \
FD3A5288F042B6850C66B31F09FE44734EB7990E \
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
B9AE9905FFD7803F25714661B63B535A4C206CA9 \
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
; do \
gpg --keyserver pgp.mit.edu --recv-keys "$key" || \
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" || \
gpg --keyserver keyserver.pgp.com --recv-keys "$key" ; \
done
# set up node
RUN buildDeps='xz-utils' \
&& set -x \
&& apt-get update && apt-get install -y $buildDeps --no-install-recommends \
&& rm -rf /var/lib/apt/lists/* \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
&& grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \
&& rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \
&& apt-get purge -y --auto-remove $buildDeps \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs
Это добавляет около 42 МБ к вашему изображению против ~ 157 МБ с помощью apt-get
.