.NET Core для Linux с докерами - создайте образ докера

2

Я хочу создать образ докера для кода, который я написал в .NET Core (С# 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

  • 0
    Образ докера Windows содержит dotnet sdk, поэтому он может запускать восстановление и публикацию dotnet. Образ Linux не содержит dotnet sdk, он содержит только среду выполнения. следовательно, он не может запустить команды восстановления и публикации.
  • 0
    Поэтому лучше запустить команду восстановления и публикации на компьютере разработчика / сборки и просто скопировать вывод в образ докера
Теги:
docker
.net-core
dockerfile

2 ответа

1
Лучший ответ

Вы должны выполнить команду восстановления и публикации вне файла 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- Запустить док-контейнер

  • 0
    Благодарю. Запуск восстановления dotnet (мне это нужно?), И я действительно опубликовал, но после сборки я получил сообщение: Вы хотели запускать команды dotnet SDK? Пожалуйста, установите dotnet SDK из
  • 0
    dotnet restore восстановит пакеты dotnet restore если вы их используете.
Показать ещё 8 комментариев
0

Почему вы используете разные 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 беспокоиться о Dockerfile и других версий. Вы используете 2.1 на Windows, но 2.0 на Linux. Это может вызвать проблемы со сборкой или временем выполнения. Не говоря уже о том, что 2.0 на самом деле не поддерживается и не будет получать исправления безопасности.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню