dotnet / sdk

Core functionality needed to create .NET Core projects, that is shared between Visual Studio and CLI
https://dot.net/core
MIT License
2.67k stars 1.06k forks source link

Cannot use an Environment Variables in DockerfileRunArguments for MSBuild #4262

Open Vaccano opened 4 years ago

Vaccano commented 4 years ago

Steps to reproduce

  1. Create an ASP.NET Web API .NET Core project that is hosted in a Linux Container.
  2. Create an environment variable that has a path as the value (ie DOCKER_CERTS and C:\src\certs)
  3. Open the project file and add the following:
    <PropertyGroup>
      <DockerfileRunArguments>-v %DOCKER_CERTS%:/https/</DockerfileRunArguments>
    </PropertyGroup>
  4. Run the project.

Expected behavior

A volume would be mounted in the container from C:\src\certs to /https/.

Actual behavior

A parsing error is given.

Environment data

dotnet --info output:

Expand for dotnet info .NET Core SDK (reflecting any global.json): Version: 3.0.100 Commit: 04339c3a26 Runtime Environment: OS Name: Windows OS Version: 10.0.18362 OS Platform: Windows RID: win10-x64 Base Path: C:\Program Files\dotnet\sdk\3.0.100\ Host (useful for support): Version: 3.0.0 Commit: 7d57652f33 .NET Core SDKs installed: 2.1.505 [C:\Program Files\dotnet\sdk] 2.1.509 [C:\Program Files\dotnet\sdk] 2.1.602 [C:\Program Files\dotnet\sdk] 2.1.604 [C:\Program Files\dotnet\sdk] 2.1.801 [C:\Program Files\dotnet\sdk] 2.2.202 [C:\Program Files\dotnet\sdk] 2.2.204 [C:\Program Files\dotnet\sdk] 2.2.401 [C:\Program Files\dotnet\sdk] 3.0.100-preview8-013656 [C:\Program Files\dotnet\sdk] 3.0.100-preview9-014004 [C:\Program Files\dotnet\sdk] 3.0.100 [C:\Program Files\dotnet\sdk] .NET Core runtimes installed: Microsoft.AspNetCore.All 2.1.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All] Microsoft.AspNetCore.All 2.1.11 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All] Microsoft.AspNetCore.All 2.1.12 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All] Microsoft.AspNetCore.All 2.1.13 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All] Microsoft.AspNetCore.All 2.2.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All] Microsoft.AspNetCore.All 2.2.5 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All] Microsoft.AspNetCore.All 2.2.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All] Microsoft.AspNetCore.All 2.2.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All] Microsoft.AspNetCore.App 2.1.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 2.1.11 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 2.1.12 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 2.1.13 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 2.2.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 2.2.5 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 2.2.6 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 2.2.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 3.0.0-preview8.19405.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 3.0.0 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.NETCore.App 2.1.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 2.1.11 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 2.1.12 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 2.1.13 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 2.2.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 2.2.5 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 2.2.6 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 2.2.7 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 3.0.0-preview8-28405-07 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 3.0.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.WindowsDesktop.App 3.0.0-preview8-28405-07 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 3.0.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
livarcocc commented 4 years ago

MSBuild already resolves environment variables as variables. You can just change your line above to the following and it should work:

-v $(DOCKER_CERTS):/https/

Can you give that a try? Also, in the future, sharing the exact error you are getting would be helpful.

Owe-Kristiansen commented 4 years ago

@livarcocc I develop in Visual Studio 2019, and in Windows.

I would like to use environment variables from launchsettings.json in DockerfileRunArguments.

My launchSettings.json contains:

{
"profiles": {
"ProjectName": {
     ...
         "environmentVariables": { ... 
               "ASPNETCORE_DATADIRECTORY": "/var/data/",

And my projectfile contains:

<DockerfileRunArguments>-v //c/data:$(ASPNETCORE_DATADIRECTORY):rw</DockerfileRunArguments>

When I start debugging the project it resolves ASPNETCORE_DATADIRECTORY to empty, and this gives the below error:

Error CTC1015 Docker command failed with exit code 125.
docker: Error response from daemon: invalid volume specification: '/c/data::rw': invalid mount config for type "bind": field Target must not be empty.
See 'docker run --help'.
If the error persists, try restarting Docker Desktop. ProjectName C:\Users\Owe Kristiansen\.nuget\packages\microsoft.visualstudio.azure.containers.tools.targets\1.10.8\build\Container.targets   198 

If I set the environment variable ASPNETCORE_DATADIRECTORY in my user environment variables in windows to "/var/data/" it works as expected (After a restart of Visual Studio).

JoostvdB94 commented 3 years ago

For my example, I need another MSBuild variable. However, it renders to an empty string.

The example that i use is -v $(TargetDir)resource.xml:/app/resource.xml. The file is placed in the /bin/Debug/netcoreapp3.1 at build time. That's why I've tried to use the TargetDir MSBuild variable.

Is there any way to use the MSBuild variables mentioned in https://docs.microsoft.com/en-us/cpp/build/reference/common-macros-for-build-commands-and-properties?view=msvc-160&viewFallbackFrom=vs-2019 ?

hcoona commented 3 months ago

+1 for MSBuild properties.