Для существующего проекта ASP.NET Core MVC на сервере сборки Windows, как настроить таргетинг на контейнер Docker, не нарушая более ранние этапы конвейера сборки? - PullRequest
2 голосов
/ 17 октября 2019

Можем ли мы добавить два дополнительных шага в конце существующего конвейера сборки? Это был бы шаг для публикации в независимый от ОС двоичный формат и шаг для запуска «сборки docker», чтобы поместить опубликованное приложение в контейнер.


Нам по-прежнему необходимо выполнить развертывание на неконтейнерном веб-сайте IIS. Мы не хотели бы переделывать весь конвейер сборки или изменять компиляцию C #, чтобы она находилась внутри контейнера Docker.

Ранние этапы конвейера сборки, скорее всего, не выполнялись бы в контейнере или не имели вопросов о лицензировании. Например, стороннее сканирование качества кода, автоматические модульные тесты и метрики кода.

Среда: - ASP.NET MVC Core v3.0, Visual Studio 2019, C #, git - сервер сборки Windows, рабочий сервер Windows дляразмещенный веб-сайт - инструменты, относящиеся к нескольким сборочным конвейерам, не могут работать в контейнере - рабочий стол Docker 19.03.02, и контейнер будет работать на сервере, отличном от веб-сайта, не относящегося к Docker - рабочий стол Docker настроен на использование контейнеров Linux. Контейнер не будет размещаться в Azure или AWS. Kubernetes может быть использован в будущем.
- Разработчики разрабатывают локально либо с локального сайта IIS, либо с веб-сайта ISS хоста Dev-сервера.

Подход 1. Я создал ASP.NET для Visual Studio 2019. Приложение Core v3.0 MVC с поддержкой Docker. Это требует от нас переделки всего нашего сборочного конвейера. Это не сработало.

Подход 2: 1. В Visual Studio 2019 создайте новое приложение ASP.NET Core MVC без поддержки Docker. Он пуст, только с веб-страницей шаблона проекта ASP.NET Visual Studio по умолчанию. Это приложение не ссылается на какие-либо базы данных, внешние службы или чтение / запись на локальный диск сервера2. Скомпилируйте, постройте сайт и перейдите к нему http://localhost:44327 показывает стартовую страницу3. Щелкните правой кнопкой мыши проект внутри решения и выберите «Опубликовать». Выберите пустой каталог для целевого местоположенияУдалить существующие файлы: TrueКонфигурация: релизИзменить параметры публикацииМетод публикации: Файловая системаКонфигурация: релизЦелевая платформа: netcoreapp 3.0Режим развертывания: Зависит от платформыTarget Runtime: PortableУдалить все существующие файлы перед публикацией: TrueВ проекте не найдены базы данных4. Создайте образ DockerОткройте командную строку Visual Studio 2019, перейдите в каталог публикацииЗапустите «docker build -t aspnetcoretestproject2.», Чтобы создать образ Docker. Запустите «docker run -d -p 8080: 80 --name myapp aspnetcoretestproject2», чтобы запустить контейнер Docker5. Откройте веб-браузер, перейдите на http://localhost:8080, и страница не отображается, Chrome и Firefox показывают ошибку не удается подключитьсяFirefox: Firefox не может установить соединение с сервером по адресу localhost: 8080. Chrome: ERR_NETWORK_ACCESS_DENIED

DockerfileОТ mcr.microsoft.com/dotnet/core/aspnet:3.0WORKDIR / приложениеКОПИЯ. ,ENTRYPOINT ["dotnet", "aspnetcoretestproject2.dll"]ЭКСПОЗИЦИЯ 80

Вывод из "docker build -t aspnetcoretestproject2."

Sending build context to Docker daemon  4.687MB
Step 1/5 : FROM mcr.microsoft.com/dotnet/core/aspnet:3.0
 ---> 675139f95df1
Step 2/5 : WORKDIR /app
 ---> Running in ab5f645d61cf
Removing intermediate container ab5f645d61cf
 ---> 4bb71c776e95
Step 3/5 : COPY . .
 ---> b7d24c41184b
Step 4/5 : ENTRYPOINT ["dotnet", "aspnetcoretestproject2.dll"]
 ---> Running in 557ca917185f
Removing intermediate container 557ca917185f
 ---> 3b578aa4bb7f
Step 5/5 : EXPOSE 80
 ---> Running in c0a9911668a9
Removing intermediate container c0a9911668a9
 ---> 316323857411
Successfully built 316323857411
Successfully tagged aspnetcoretestproject2:latest
SECURITY WARNING: You are building a Docker image from Windows against a   non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directorie

образ докера ls

REPOSITORY                             TAG                 IMAGE ID            CREATED              SIZE
aspnetcoretestproject2                 latest              316323857411        About a minute ago   212MB
mcr.microsoft.com/dotnet/core/sdk      3.0-buster          4422e7fb740c        3 weeks ago          689MB
mcr.microsoft.com/dotnet/core/aspnet   3.0                 675139f95df1        3 weeks ago          207MB
mcr.microsoft.com/dotnet/core/aspnet   3.0-buster-slim     675139f95df1        3 weeks ago          207MB
k8s.gcr.io/kube-proxy                  v1.14.6             ed8adf767eeb        8 weeks ago          82.1MB
k8s.gcr.io/kube-apiserver              v1.14.6             0e422c9884cf        8 weeks ago          209MB
k8s.gcr.io/kube-scheduler              v1.14.6             d27987bc993e        8 weeks ago          81.6MB
k8s.gcr.io/kube-controller-manager     v1.14.6             4bb274b1f2c3        8 weeks ago          157MB
docker/kube-compose-controller         v0.4.23             a8c3d87a58e7        4 months ago         35.3MB
docker/kube-compose-api-server         v0.4.23             f3591b2cb223        4 months ago         49.9MB
alpine                                 3.5                 f80194ae2e0c        8 months ago         4MB
k8s.gcr.io/coredns                     1.3.1               eb516548c180        9 months ago         40.3MB
k8s.gcr.io/etcd                        3.3.10              2c4adeb21b4f        10 months ago        258MB
k8s.gcr.io/pause                       3.1                 da86e6ba6ca1        22 months ago        742kB
node                                   6.11.5              852391892b9f        23 months ago        662MB

контейнер докера ls

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
defe82a7223a        f80194ae2e0c        "ping 8.8.8.8"      6 minutes ago           Up 6 minutes                            k8s_testpod_demo_default_dd2702f7-eeac-11e9-a181-00155dde9201_5

Publish directory contents

    10/16/2019  09:31 AM               340 .dockerignore
    10/16/2019  01:29 PM               146 appsettings.Development.json
    10/16/2019  01:29 PM               192 appsettings.json
    10/16/2019  04:24 PM           106,602 AspNetCoreTestProject2.deps.json
    10/16/2019  04:24 PM             9,216 AspNetCoreTestProject2.dll
    10/16/2019  04:24 PM           159,744 AspNetCoreTestProject2.exe
    10/16/2019  03:45 PM               224 AspNetCoreTestProject2.runtimeconfig.json
    10/16/2019  04:24 PM            35,840 AspNetCoreTestProject2.Views.dll
    10/16/2019  07:12 PM               160 Dockerfile
    10/16/2019  04:24 PM               566 web.config
    10/16/2019  04:24 PM              wwwroot

Есть ли пропущенный шаг или неправильная конфигурация в Dockerfile?

    FROM mcr.microsoft.com/dotnet/core/aspnet:3.0
    WORKDIR /app
    COPY . .
    ENTRYPOINT ["dotnet", "aspnetcoretestproject2.dll"]
    EXPOSE 80

Ожидаемый результат будет для главной страницы веб-сайта, которая будет видна при переходе на localhost: 8080.

Я попробовал демо на основе nodejs для книги назначений с веб-сайта справки docker, и она работает и отображает стартовую страницу для веб-сайта. Таким образом, веб-сайт внутри контейнера на моем локальном компьютере можно просматривать из браузера на том же локальном компьютере.

Ссылки .NET Core - включая ASP.NET .Core - https://hub.docker.com/_/microsoft-dotnet-corehttps://docs.microsoft.com/en-us/dotnet/core/docker/introduction.NET примеры https://github.com/docker/labs/blob/master/windows/readme.mdhttps://docs.microsoft.com/en-us/dotnet/core/docker/build-containerПоддержка док-станции Visual Studio 2019 https://docs.microsoft.com/en-us/visualstudio/containers/overview?view=vs-2019Сборка ядра .net внутри контейнера Docker - https://docs.docker.com/engine/examples/dotnetcore/Устранение неполадок в докереide Visual Studio https://docs.microsoft.com/en-us/visualstudio/containers/troubleshooting-docker-errors?view=vs-2019

1 Ответ

0 голосов
/ 17 октября 2019

Исправлено двумя изменениями:1) Измените имя DLL в Dockerfile, чтобы оно было чувствительным к регистру. Приложение работает внутри контейнера, чья ОС чувствительна к регистру Linux. 2) Измените отображение номера порта в команде «Docker Run»

Действия по устранению неполадок:1. В окне командной строки Visual Studio 2019 перейдите в каталог публикации2. Запустите веб-сайт «dotnet AspNetMvcCoreTestApp2.dll». Эта команда выполняется внутри контейнера Docker. Он производит этот вывод. Обратите внимание на номер порта 5000информация: Microsoft.Hosting.Lifetime [0]Сейчас слушаю: http://localhost:5000
информация: Microsoft.Hosting.Lifetime [0]Сейчас слушаю: https://localhost:5001
информация: Microsoft.Hosting.Lifetime [0]Приложение запущено. Нажмите Ctrl + C, чтобы выключить. 3. Откройте браузер и перейдите на http://localhost:5000/ и откроется стартовая страница сайта. 4. Измените Dockerfile, чтобы получить список правильных имен DLL, включая буквы с учетом регистра. Также убедитесь, что версия ядра .NET в Dockerfile совпадает с версией обозревателя Visual Stuido 2019.

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "AspNetCoreTestProject2.dll"]
EXPOSE 80
При необходимости удалите все изображения контейнера в Docker. Запустите «docker image ls» и запишите IMAGE_ID существующего изображения, если оно существуетЗапустите "docker rmi IMAGE_ID", чтобы удалить изображение Сборка образа докера "сборка докера -t aspnetcoretestproject2." Введите «docker image ls» и запишите значение IMAGE_ID для aspnetcoretestproject2
    REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
    aspnetcoretestproject2                 latest              58c92979be61        3 minutes ago       212MB
    mcr.microsoft.com/dotnet/core/sdk      3.0-buster          4422e7fb740c        3 weeks ago         689MB
Запустите отображение образа докера для локального хост-порта 5000 на порт 80 внутри контейнера Docker"Docker run -d -p 5000: 80 58c92979be61" Убедитесь, что Docker-контейнер запущен с помощью «Docker container ls»
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    c52ab21b9c25        58c92979be61        "dotnet AspNetCoreTe…"   4 seconds ago       Up 2 seconds        0.0.0.0:5000->80/tcp   magical_leavitt
    e4152fcb2233        f80194ae2e0c        "ping 8.8.8.8"           3 minutes ago       Up 3 minutes                               k8s_testpod_demo_default_dd2702f7-eeac-11e9-a181-00155dde9201_2
Откройте веб-браузер и введите http://localhost:5000 в строке URL. Это должно показать стартовую страницу веб-сайта ASP.NET
...