Поделиться через


Создание проекта контейнера из командной строки

Если вы хотите создать проект контейнера с dockerfile за пределами Visual Studio, можно использовать docker build, MSBuild, dotnet buildили dotnet publish для сборки из командной строки.

Если вы используете тип сборки пакета SDK для .NET, у вас нет файла Dockerfile, поэтому вы не можете использовать docker build; Вместо этого используйте MSBuild, dotnet build или dotnet publish для сборки в командной строке.

Использование сборки Docker

Чтобы создать контейнерное решение из командной строки, обычно можно использовать команду docker build <context> для каждого проекта в решении. Вы предоставляете аргумент контекста сборки . Контекст сборки для файла Dockerfile — это папка на локальном компьютере, которая используется в качестве рабочей папки для создания образа. Например, это папка, из которую копируются файлы при копировании в контейнер. В проектах .NET Core по умолчанию используется папка, содержащая файл решения (.sln). Выраженный как относительный путь, этот аргумент обычно является "." для Файла Dockerfile в папке проекта и файла решения в родительской папке. Для проектов .NET Framework контекст сборки по умолчанию — это папка проекта, а не папка решения.

docker build -f Dockerfile ..

Контекст сборки в файле проекта можно задать, задав свойство DockerfileContext. Например

<PropertyGroup>
   <DockerfileContext>contextfolder</DockerfileContext>
</PropertyGroup>

Относительные пути в Dockerfile относятся к контексту сборки, поэтому при изменении контекста обязательно обновите относительные пути соответствующим образом.

При добавлении поддержки Docker в проект в Visual Studio версий 17.11 и выше, можно указать папку для контекста сборки. Если вы хотите изменить контекст сборки, можно удалить Dockerfile (если у него нет других изменений, которые вы хотите сохранить), и повторно запустить добавить поддержку Docker, на этот раз указав новый контекст сборки. Новый Dockerfile будет иметь относительные пути, обновленные в соответствии с новым контекстом сборки.

Использование MSBuild

Заметка

В этом разделе описывается, как настроить контейнеры Docker при выборе типа сборки контейнера Dockerfile. Если вы используете тип сборки пакета SDK для .NET, параметры настройки отличаются, а сведения в этой статье не применимы. Вместо этого см. инструкцию Containerize a .NET app with dotnet publish.

Dockerfiles, созданные в Visual Studio для проектов .NET Framework (и для проектов .NET Core, созданных с помощью версий Visual Studio до обновления 4 в 2017 году), не являются многоэтапными файлами. Шаги в этих Dockerfile не компилируют ваш код. Вместо этого, когда Visual Studio создает Dockerfile .NET Framework, сначала компилирует проект с помощью MSBuild. После успешного выполнения Visual Studio создает Dockerfile, который просто копирует выходные данные сборки из MSBuild в полученный образ Docker. Поскольку шаги по компиляции вашего кода не включены в Dockerfile, вы не можете создавать Dockerfiles .NET Framework с использованием docker build из командной строки. Для создания этих проектов следует использовать MSBuild.

Чтобы создать образ для одного проекта контейнера Docker, можно использовать MSBuild с параметром команды /t:ContainerBuild. Эта команда указывает MSBuild строить цель ContainerBuild, а не цель Buildпо умолчанию. Например:

MSBuild MyProject.csproj /t:ContainerBuild /p:Configuration=Release

При сборке решения из интегрированной среды разработки Visual Studio отображаются выходные данные, аналогичные тем, что вы видите в окне вывода . Всегда используйте /p:Configuration=Release, так как в случаях, когда Visual Studio использует многоступенчатую оптимизацию сборки, результаты при создании конфигурации Debug могут быть неожиданными. См. раздел Настройка образов контейнеров для отладки.

Если вы используете проект Docker Compose, используйте эту команду для создания образов:

msbuild /p:SolutionPath=<solution-name>.sln /p:Configuration=Release docker-compose.dcproj

Сведения о просмотре журналов MSBuild см. в статье Получение журналов сборки с помощью MSBuild.