Docker窗口容器文件访问权限问题

时间:2017-11-15 16:08:10

标签: powershell docker windows-server windows-container windows-server-container

  

Windows Server 2016主机,通过默认的MSFTdocker提供程序运行Docker EE。

     

Docker版本17.06.2-ee-5,build 508bb92

     

docker-compose版本1.17.1,build 6d101fb0

我有一个基于microsoft/windowsservercore:latest的Windows容器,我正在尝试为Bamboo服务器设置映像。在创建构建计划期间,服务器生成一个密码以在Bamboo和Bitbucket之间进行通信。在正在运行的容器中,密码文件夹/文件生成失败,并显示以下错误:

java.nio.file.AccessDeniedException: C:\bamboo-home\xml-data\configuration\cipher\cipher.key_0

我尝试将卷C:\bamboo-home连接到我的Windows主机,并完全包含在容器中。两次都出现同样的错误。

Windows容器使用名为' containeradministrator&#39 ;;的管理员帐户运行这是默认图像和使用入口点时的情况,如下所示。

运行标准图片

PS C:\> docker run -it microsoft/windowsservercore:latest powershell
Windows PowerShell Copyright (C) 2016 Microsoft Corporation. All
rights reserved.

PS C:\> whoami 
user manager\containeradministrator

在自定义图像上测试入口点:

PS C:\test> docker-compose build
Building testentrypoint
Step 1/2 : FROM microsoft/windowsservercore:latest
---> 2cddde20d95d
Step 2/2 : ENTRYPOINT whoami
---> Running in 7fe31f02e45f
---> 60822e1907f1
Removing intermediate container 7fe31f02e45f
Successfully built 60822e1907f1
Successfully tagged test/entrypoint:latest
PS C:\test> docker-compose up
Creating network "test_default" with the default driver
Creating test_testentrypoint_1 ...
Creating test_testentrypoint_1 ... done
Attaching to test_testentrypoint_1
testentrypoint_1 | user manager\containeradministrator
test_testentrypoint_1 exited with code 0

此用户是我可以告诉管理员的别名,尽管有趣的是它并没有以net user的名称显示在此名称中:

PS C:\> net user

User accounts for \\

-------------------------------------------------------------------------------
Administrator            DefaultAccount           Guest
The command completed with one or more errors.

所以这可能是一个问题,但无论如何,用户都拥有我所知道的完全管理权限:

PS C:\> $user = [Security.Principal.WindowsIdentity]::GetCurrent()
PS C:\> $user

AuthenticationType : Negotiate
ImpersonationLevel : None
IsAuthenticated    : True
IsGuest            : False
IsSystem           : False
IsAnonymous        : False
Name               : User Manager\ContainerAdministrator
Owner              : S-1-5-93-2-1
User               : S-1-5-93-2-1
Groups             : {S-1-1-0, S-1-5-32-545, S-1-5-6, S-1-2-1...}
Token              : 3052
AccessToken        : Microsoft.Win32.SafeHandles.SafeAccessTokenHandle
UserClaims         : {http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name: User Manager\ContainerAdministrator, http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid: S-1-5-93-2-1, http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid:
                     S-1-1-0, http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid: S-1-5-32-545...}
DeviceClaims       : {}
Claims             : {http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name: User Manager\ContainerAdministrator, http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid: S-1-5-93-2-1, http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid:
                     S-1-1-0, http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid: S-1-5-32-545...}
Actor              :
BootstrapContext   :
Label              :
NameClaimType      : http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name
RoleClaimType      : http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid

PS C:\> (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
True

所以我尝试了以下内容:

  1. 在容器中运行构建步骤,将文件夹权限设置为" Everyone - Full Access"

  2. 在启动时在正在运行的容器中手动运行脚本

  3. 运行时连接到容器,并手动运行powershell以执行相同的操作

  4. 每次尝试生成密码文件之前,权限都如下所示:

    PS C:\> Get-ACL C:\bamboo-home\xml-data\configuration\ | fl
    
    Path   : Microsoft.PowerShell.Core\FileSystem::C:\bamboo-home\xml-data\configuration\
    Owner  : User Manager\ContainerAdministrator
    Group  : User Manager\ContainerAdministrator
    Access : Everyone Allow  FullControl
             NT AUTHORITY\SYSTEM Allow  FullControl
             BUILTIN\Administrators Allow  FullControl
             S-1-5-21-2465844383-291681238-1546083700-500 Allow  FullControl
    Audit  :
    Sddl   : O:S-1-5-93-2-1G:S-1-5-93-2-1D:AI(A;OICIID;FA;;;WD)(A;OICIID;FA;;;SY)(A;OICIID;FA;;;BA)(A;OICIID;FA;;;S-1-5-21-2465844383-291681238-1546083700-500)
    

    尝试生成后出现上述错误,权限更改为:

    PS C:\> Get-ACL C:\bamboo-home\xml-data\configuration\ | fl
    
    Path   : Microsoft.PowerShell.Core\FileSystem::C:\bamboo-home\xml-data\configuration\
    Owner  : User Manager\ContainerAdministrator
    Group  : User Manager\ContainerAdministrator
    Access : Everyone Allow  FullControl
    Audit  :
    Sddl   : O:S-1-5-93-2-1G:S-1-5-93-2-1D:AI(A;OICI;FA;;;WD)
    

    为什么默认帐户(可能是名为containeradministrator的管理员)在看来表明它拥有所有权时会失去对该目录的访问权限?为什么它首先不能创建文件(或文件夹),因为在这两种情况下," Everyone"应该有完全访问权限吗?

1 个答案:

答案 0 :(得分:0)

我没有确定主机/容器权限之间的问题,但是我提出容器的方式允许问题发生。通过更改我的设置过程,我能够纠正此问题。

初始创建(对已创建文件夹的权限失败):

  1. 在主机上创建空白文件夹。
  2. 作为卷链接到compose到容器内部文件夹(在这种情况下全部为C:\ bamboo-home)。这是Bamboo将放置其所有配置/工作区内容的文件夹。
  3. 在容器内设置产品,除了密码文件夹失败外,一切正常。在此步骤之前没有注意到问题。
  4. 新创作(运作正常):

    1. 在主机上创建空白文件夹。
    2. 作为卷链接到compose到容器内部文件夹(在这种情况下为C:\ empty)。这不会链接到C:\ bamboo-home,它将根据需要在运行容器内部进行。
    3. 在容器内设置产品。完成后,将所有文件从容器的文件夹复制到创建的新空白文件夹。这样,权限在容器本身内以一致的方式设置,并减轻了之前的问题。