.NET Core для Linux с докерами - создайте образ докера - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу создать образ докера для кода, написанного в .NET Core (C # Visual Studio 2017), который можно запустить в Linux.

Шаги - я создаю новый файл, например, hello world:

using System;

namespace myApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

Файл докера (для Windows), который был протестирован и работает:

FROM microsoft/dotnet:2.1-sdk
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy and build everything else
COPY . ./
RUN dotnet publish -c Release -o out
ENTRYPOINT ["dotnet", "out/myApp.dll"]

Файл Docker для Linux:

FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY ./publish .
ENTRYPOINT ["dotnet", "Receive.dll"]

Выше не работает хорошо.

При запуске (в командной строке. Контейнер Linux):

docker build . -t myapp_linux

Я получил сообщение:

Сбой копирования: stat / var / lib / docker / tmp / docker-builder786597608 / publish: нет такого файла или каталога

Также попытался изменить конфигурацию на что-то вроде:

FROM microsoft/aspnetcore:2.0
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy and build everything else
COPY . ./
RUN dotnet publish -c Release -o out
ENTRYPOINT ["dotnet", "Receive.dll"]

Выше не работает, и я получил сообщение:

Вы хотели запускать команды dotnet SDK? Пожалуйста, установите dotnet SDK из: http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Почему вы используете разные Dockerfile с? Весь смысл контейнеров в том, чтобы получить согласованную среду. Используйте тот, который вы используете в Windows (который, как вы знаете, работает), везде:

FROM microsoft/dotnet:2.1-sdk
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy and build everything else
COPY . ./
RUN dotnet publish -c Release -o out
ENTRYPOINT ["dotnet", "out/myApp.dll"]

Для этого есть ряд преимуществ:

  1. Вы строите код одинаково в Windows и Linux. Больше никаких отличий в операционной системе, таких как те, с которыми вы работаете.
  2. Если вы заботитесь о воспроизводимом развертывании через контейнеры, разве вы не хотите создавать также и воспроизводимую среду? В противном случае то, что установлено в вашей ОС, влияет на то, как ваш код компилируется и выполняется.
  3. Больше не нужно беспокоиться о синхронизации Dockerfile и других версий. Вы используете 2.1 в Windows, но 2.0 в Linux. Это может вызвать проблемы со сборкой или временем выполнения. Не говоря уже о том, что 2.0 на самом деле не поддерживается и не будет получать исправления безопасности.
0 голосов
/ 08 ноября 2018

Вы должны запустить команду восстановления и публикации вне файла Docker, например. PowerShell первый а затем просто скопируйте вывод в Docker, в файле Docker.

1- Первый запуск в cmd или powershell:

dotnet restore
dotnet publish -o ./publish

2- В вашем файле Docker:

FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY ./publish .
ENTRYPOINT ["dotnet", "Receive.dll"]

3 - Построить образ докера

4- Запустить док-контейнер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...