Steven Liekens
Steven Liekens

Reputation: 14113

How to mount dotnet user-secrets in a devcontainer?

I use a devcontainer for building and debugging my .NET Core apps. I'd like to share user-secrets between my host machine and the container.

How can I do this if the the location of the usersecrets depends on the host machine?

I tried mounting both locations, but that throws an error.

{
  "dockerComposeFile":"docker-compose.yml",
  "service":"devcontainer",
  "runServices":[],
  "workspaceFolder":"/workspace",
  "forwardPorts":[
    5000,
    5001
  ],
  "remoteEnv":{
    "ASPNETCORE_ENVIRONMENT":"Development",
    "ASPNETCORE_URLS":"https://+:5001;http://+:5000"
  }
}
version: "3.7"
services:
    devcontainer:
        image: mydevcontainerimage:12345
        volumes:
            - ..:/workspace:cached
            - ${APPDATA}/Microsoft/UserSecrets/:/root/.microsoft/usersecrets
            - ${HOME}/.microsoft/usersecrets:/root/.microsoft/usersecrets

            # Forwards the local Docker socket to the container.
            - /var/run/docker.sock:/var/run/docker.sock
        command: sleep infinity

Docker-compose crashes with an error.

ERROR: Duplicate mount points: [/.microsoft/usersecrets:/root/.microsoft/usersecrets:rw, C:\Users\steven\AppData\Roaming\Microsoft\UserSecrets:/root/.microsoft/usersecrets:rw]

Upvotes: 2

Views: 3268

Answers (1)

nvidot
nvidot

Reputation: 1412

The solution might be to use a named volume between the host and the container. Hence, the docker-compose will only reference that named volume. The named volume creation will be specific to the host though.

For named volume creation based on host path, see here

But as stated here

The built-in local driver on Windows does not support any options.

And for example device=c:\a\path\to\my\folder will not work under Windows.

But, given that the windows path %APPDATA% expands to something like c:\a\path\to\my\folder you can rephrase it as /host_mnt/c/a/path/to/my/folder and use that for device:

docker volume create --name my_test_volume --opt type=none --opt device=device=/host_mnt/c/a/path/to/my/folder --opt o=bind

For others, this supposes that c: is made accessible in docker settings (Resources / File sharing).

Upvotes: 2

Related Questions