Condividi tramite


Compilare un progetto contenitore dalla riga di comando

Se si vuole compilare un progetto contenitore con un Dockerfile all'esterno di Visual Studio, è possibile usare docker build (o podman build) o dotnet publish /t:PublishContainer per eseguire la compilazione dalla riga di comando.

Se si usa il tipo di compilazione .NET SDK, non si ha un Dockerfile, quindi non è possibile usare docker build o podman build, usare dotnet publish /t:PublishContainer invece per compilare la riga di comando.

Se si vuole compilare un progetto contenitore con un Dockerfile all'esterno di Visual Studio, è possibile usare docker build o dotnet publish /t:PublishContainer per eseguire la compilazione dalla riga di comando.

Se si usa il tipo di compilazione .NET SDK, non è disponibile un Dockerfile, quindi non è possibile usare docker build. Usare dotnet publish /t:PublishContainer invece per compilare la riga di comando.

Prerequisiti

Prerequisiti

  • Docker Desktop.
  • Visual Studio con il carico di lavoro sviluppo per applicazioni Web e ASP.NET, sviluppo di Azure e/o sviluppo per desktop .NET installato.

Usare la compilazione Docker

Per compilare una soluzione in contenitori dalla riga di comando, è in genere possibile usare il comando docker build <context> per ogni progetto nella soluzione. Devi fornire l'argomento al contesto di compilazione. Il contesto di compilazione per un Dockerfile è la cartella nel computer locale usato come cartella di lavoro per generare l'immagine. Ad esempio, si tratta della cartella da cui si copiano i file quando si copia nel contenitore. Nei progetti .NET Core l'impostazione predefinita consiste nell'usare la cartella che contiene il file della soluzione (.sln o slnx). Indicato come percorso relativo, questo argomento è in genere ".." per un Dockerfile in una cartella del progetto e il file della soluzione nella cartella superiore.

docker build -f Dockerfile ..

Per i progetti .NET Framework, il contesto di compilazione predefinito è la cartella del progetto, non la cartella della soluzione.

È possibile impostare il contesto di compilazione nel file di progetto impostando la proprietà DockerfileContext. Per esempio

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

Usare la compilazione Docker o podman

Per compilare una soluzione in contenitori dalla riga di comando, è in genere possibile usare il comando docker build <context> (o podman build <context>) per ogni progetto nella soluzione. Devi fornire l'argomento al contesto di compilazione. Il contesto di compilazione per un Dockerfile è la cartella nel computer locale usato come cartella di lavoro per generare l'immagine. Ad esempio, si tratta della cartella da cui si copiano i file quando si copia nel contenitore. Nei progetti .NET Core l'impostazione predefinita consiste nell'usare la cartella che contiene il file della soluzione (.sln o slnx). Indicato come percorso relativo, questo argomento è in genere ".." per un Dockerfile in una cartella del progetto e il file della soluzione nella cartella superiore.

docker build -f Dockerfile ..
podman build -f Dockerfile ..

È possibile impostare il contesto di compilazione nel file di progetto impostando la proprietà ContainerBuildContext. Per esempio

<PropertyGroup>
   <ContainerBuildContext>contextfolder</ContainerBuildContext>
</PropertyGroup>

I percorsi relativi nel Dockerfile sono relativi al contesto di compilazione, quindi se si modifica il contesto, assicurarsi di aggiornare di conseguenza i percorsi relativi.

Con Visual Studio 17.11 e versioni successive, quando si aggiunge il supporto Docker a un progetto, è possibile specificare una cartella per il contesto di compilazione. Se si vuole modificare il contesto di compilazione, è possibile eliminare il Dockerfile (se non sono presenti altre modifiche da mantenere) ed eseguire di nuovo Aggiungi supporto Docker, questa volta specificando il nuovo contesto di compilazione. Il nuovo Dockerfile avrà percorsi relativi aggiornati in modo che corrispondano al nuovo contesto di compilazione.

Quando si aggiunge il supporto del contenitore a un progetto, è possibile specificare una cartella per il contesto di compilazione. Se si vuole modificare il contesto di compilazione, è possibile eliminare il Dockerfile (se non sono presenti altre modifiche da mantenere) ed eseguire di nuovo Aggiungi supporto contenitori, questa volta specificando il nuovo contesto di compilazione. Il nuovo Dockerfile avrà percorsi relativi aggiornati in modo che corrispondano al nuovo contesto di compilazione.

Usare MSBuild

Nota

Questa sezione descrive come personalizzare i contenitori quando si sceglie il tipo di compilazione del contenitore Dockerfile. Se si usa il tipo di compilazione .NET SDK, le opzioni di personalizzazione sono diverse e le informazioni contenute in questo articolo non sono applicabili. In alternativa, vedi Containerizzare un'app .NET con dotnet publish.

I Dockerfile creati da Visual Studio per i progetti .NET Framework (e per i progetti .NET Core creati con versioni di Visual Studio precedenti a Visual Studio 2017 Update 4) non sono dockerfile a più passaggi. I passaggi in questi Dockerfile non compilano il codice. Al contrario, quando Visual Studio compila un Dockerfile di .NET Framework, compila prima il progetto usando MSBuild. Quando l'operazione riesce, Visual Studio compila quindi il Dockerfile, che copia semplicemente l'output di compilazione da MSBuild nell'immagine Docker risultante. Poiché i passaggi per compilare il codice non sono inclusi nel Dockerfile, non è possibile compilare dockerfile di .NET Framework usando docker build dalla riga di comando. È consigliabile usare MSBuild per compilare questi progetti.

Per compilare un'immagine per un singolo progetto contenitore Docker, è possibile usare MSBuild con l'opzione di comando /t:ContainerBuild. Questo comando indica a MSBuild di costruire il target ContainerBuild anziché il target predefinito Build. Per esempio:

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

Vedi un output simile a quello che visualizzi nella finestra Output quando si costruisce la propria soluzione dall'IDE di Visual Studio. Usare sempre /p:Configuration=Release, poiché nei casi in cui Visual Studio utilizza l'ottimizzazione della compilazione a più fasi, i risultati potrebbero non essere come previsto durante la compilazione della configurazione Debug. Consultare Personalizzare le immagini dei contenitori per il debugging.

Se si usa un progetto Docker Compose, usare questo comando per compilare immagini:

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

Per visualizzare i log di MSBuild, vedere Ottenere i log di compilazione con MSBuild.

Compilare dalla riga di comando

Visual Studio usa la modalità rapida (se abilitata) per produrre un'immagine del contenitore configurata per funzionare al meglio per lo sviluppo e il debug, pertanto non è consigliabile copiare i comandi di compilazione docker dalla finestra Output dopo una compilazione in modalità rapida. Per compilare un'immagine standard senza ottimizzazioni non standard, è possibile fare clic con il pulsante destro del mouse sul Dockerfile e scegliere l'opzione Compila immagine Docker .

Visual Studio usa la modalità rapida (se abilitata) per produrre un'immagine del contenitore configurata per funzionare al meglio per lo sviluppo e il debug, pertanto non è consigliabile copiare i docker build comandi o podman build dalla finestra output dopo una compilazione in modalità rapida. Per compilare un'immagine standard senza ottimizzazioni non standard, è possibile fare clic con il pulsante destro del mouse sul Dockerfile e scegliere l'opzione Compila immagine .

Visual Studio usa il dev tag per designare immagini appositamente preparate per ottimizzare il tempo di avvio durante il debug. Tuttavia, queste immagini non devono essere usate al di fuori del contesto di Visual Studio. Questo tag indica che le immagini hanno modifiche e personalizzazioni non standard, ad esempio per supportare il debug in modalità rapida. Vedi Personalizzare i contenitori Docker in Visual Studio.