Я хочу создать образ докера для кода, который я написал в .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
Вы должны выполнить команду восстановления и публикации вне файла 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- Запустить док-контейнер
dotnet restore
восстановит пакеты dotnet restore
если вы их используете.
Почему вы используете разные 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"]
Для этого есть ряд преимуществ:
Dockerfile
беспокоиться о Dockerfile
и других версий. Вы используете 2.1
на Windows, но 2.0
на Linux. Это может вызвать проблемы со сборкой или временем выполнения. Не говоря уже о том, что 2.0 на самом деле не поддерживается и не будет получать исправления безопасности.