Docker 和我正在开发的应用程序使用的目录中存在权限错误

Docker 和我正在开发的应用程序使用的目录中存在权限错误

我已经从我自己在 C# 上开发的应用程序运行了一个 docker 容器 mysql,并将数据持久化配置到这个路径:

C:\ProgramData\Persistence\data\mysql

当我开始时一切顺利,因为没有数据(第一次运行)

在此处输入图片描述

一旦我开始开发(创建数据库......等等)并且由于某种原因我重新启动了电脑并再次打开docker-desktop并启动容器,它就不再起作用了......

在此处输入图片描述

我已经确定问题出在目录权限、只读属性上(我仍在调查原因……):

在此处输入图片描述

我已经调查过,并尝试使用以下方法解决:

从CMD:icacls "C:\ProgramData\Persistence" /grant Everyone:(OI)(CI)F /T

表单 PowerShell:Get-ChildItem -Path "C:\ProgramData\Persistence" -Recurse | ForEach-Object { $_.Attributes -= "ReadOnly" }

这些命令是由我的个人用户以具有活动管理员权限并以管理员权限运行 CMD 和 Powershell 执行的。

但问题仍然存在...我找不到编程方式或在 YML 文件中解决它,这是我唯一的兴趣......

日志内容:

2024-04-15 16:31:39+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.3.0-1.el8 started.
2024-04-15 16:31:39+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2024-04-15 16:31:39+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.3.0-1.el8 started.
ln: failed to create symbolic link '/var/lib/mysql/mysql.sock': Permission denied
2024-04-15T16:31:39.941325Z 0 [System] [MY-015015] [Server] MySQL Server - start.
2024-04-15T16:31:40.118455Z 0 [Warning] [MY-010915] [Server] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
2024-04-15T16:31:40.123899Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.3.0) starting as process 1
2024-04-15T16:31:40.127250Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
mysqld: File './binlog.index' not found (OS errno 13 - Permission denied)
2024-04-15T16:31:40.128854Z 0 [ERROR] [MY-010119] [Server] Aborting
2024-04-15T16:31:40.129566Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.3.0)  MySQL Community Server - GPL.
2024-04-15T16:31:40.129575Z 0 [System] [MY-015016] [Server] MySQL Server - end.

我已经验证手动更改形状属性可以解决这个问题,但这不是我想要的。

更新 1

我尝试对我的 YML 文件和 docker 文件进行一些更改:

    volumes:
      - ./data/mysql:/var/lib/mysql:rw
      - ./log/mysql:/var/log/mysql:rw

RUN mkdir -p /var/log/mysql
RUN chmod -R 0755 /var/lib/mysql /var/log/mysql /etc/mysql

我的期望是这样的一件事能够奏效。

更新 2

我一直在评估,由于某种原因,问题与docker的工作方式和目录结构有关......以及与第三方软件的交互......

问题发生的方式如下:

  1. 一旦 docker 第一次启动容器和 mysql 内容,一切都会顺利...
  2. 如果碰巧另一个第三方软件或工具使用或进入持久性数据所在的路径,这些。
  3. 当您重新启动系统时,它会停止正常工作。好像在第三方应用程序和重新启动之间发生了一些权限问题......这听起来很愚蠢,但似乎那一刻确实发生了一些事情。

这是我的 PS 脚本

我想认为有一种方法可以从构建结构和docker /容器环境的yml中本地解决问题,但到目前为止我还没有解决它...因此我求助于解决这个问题,每次出现这种情况时,您都需要在powershell中手动运行此脚本:

# Define the path to the directory
$directoryPath = "C:\ProgramData\Persistence"

# Get the current ACL (Access Control List) for the directory
$acl = Get-Acl $directoryPath

# Define the permission rule to grant full control to everyone
$permission = "Everyone", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"

# Create a new access rule
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission

# Add the access rule to the ACL
$acl.AddAccessRule($accessRule)

# Set the ACL for the directory
Set-Acl -Path $directoryPath -AclObject $acl

# Check if the permissions were applied successfully
Get-Acl $directoryPath

所以:

虽然这个脚本解决了手动启动/检测的问题,但这不是我期望解决问题的方式,我仍然在寻找一种替代方案防止这个情况。

答案1

看起来您正在使用 Docker Desktop。这会运行一个 VM,而后者又托管您的容器。该 VM 运行 Linux。您加载的 docker 镜像是针对 Linux 和 X86_64 编译的 Linux 二进制文件。

但是,你给它提供了一个 NTFS 文件系统!不仅如此,其中还有一个转换层,可以将 NTFS 转换为 Linux VM (WSL2) 可以理解的内容。WSL2 不适用于服务器和多用户部署,而是用于开发,因此有些事情会出错。

解决你的问题的方法是使用Docker 卷。它们速度更快、更不易损坏,并且其行为方式与您正在运行的软件所期望的方式一致。

关于只读属性,请读这个

相关内容