Разрешения на запись в томе Docker - PullRequest
0 голосов
/ 02 июля 2018

Я создал том докера с:

docker volume create my-volume-name

В моем консольном приложении, запущенном в Docker-контейнере, я использую конфигурацию создания, подобную этой:

{
  "HostConfig": {
    "Binds": [
      "my-volume-name:/app/my-volume-name:rw"
    ],
    "Privileged": true
  }
}

Контейнер видит том, но не имеет никаких прав для записи в него.
Это дает мне ошибку «Отказано в разрешении». (за исключением того, что я пытаюсь создать файл в томе).

        //create a file
        try{
        string path = Path.Combine(Directory.GetCurrentDirectory(), "my-volume-name","example.txt");
        Console.WriteLine($"PATH {path}");
        if (!File.Exists(path)){
            File.Create(path);
            TextWriter tw = new StreamWriter(path);
            tw.WriteLine($"{DateTime.Now.ToString()}The very first line!");
            tw.Close();
        }else if (File.Exists(path)){
            using(var tw = new StreamWriter(path, true)){tw.WriteLine($"{DateTime.Now.ToString()}The next line!");}
        }
        }catch(Exception e){Console.WriteLine($"ERROR:{e.ToString()}");}

Вот что я получаю:

 Access to the path '/app/my-volume-name/example.txt' is denied. ---> System.IO.IOException: Permission denied

Чего мне не хватает для возможности записи на том, который я создал с помощью команды docker volume create? Цель здесь - создать общий хост на хосте, который определенные контейнеры, которые я создал, могут читать и записывать в него.

edit (добавлен dockerfile):

FROM microsoft/dotnet:2.0-runtime-stretch AS base

RUN apt-get update && \
    apt-get install -y --no-install-recommends unzip procps && \
    rm -rf /var/lib/apt/lists/*

RUN useradd -ms /bin/bash moduleuser
USER moduleuser


RUN curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg

FROM microsoft/dotnet:2.0-sdk AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Debug -o out

FROM base
WORKDIR /app
COPY --from=build-env /app/out ./

#moving down because CI/CD builds in VSTS didnt like two copies next to each other.

ENTRYPOINT ["dotnet", "ResourceModule.dll"]

Когда я ls -l в контейнере, я вижу это:

drwxr-xr-x 3 root root    4096 Jul  2 13:28 my-volume-name

изменить 2: Когда я удаляю создание moduleuser в dockerfile, я получаю эту ошибку:

ERROR:System.IO.IOException: The process cannot access the file '/app/my-volume-name/example.txt' because it is being used by another process.   

Но он был создан - похоже, я на правильном пути.

1 Ответ

0 голосов
/ 02 июля 2018

docker volume create my-volume-name создаст пространство с привилегиями root. Пожалуйста, проверьте в контейнере, с каким пользователем работает ваше приложение. Либо обновите владельца тома, либо запустите приложение с пользователем root. если нужна дополнительная помощь, предоставьте dockerfile, используемый для приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...