linux 目录的内容仅部分绑定在Docker卷中

qkf9rpyu  于 2023-08-03  发布在  Linux
关注(0)|答案(1)|浏览(76)

我有一个在Docker容器中运行的Node.JS服务,它通过REST部署相关的Docker容器(Docker-outside-of-Docker)。
动作序列(在NodeJS容器中):
1.创建新文件夹。
1.从git存储库下载一个包含目录结构和文件的归档文件。
1.解压缩归档文件(目标文件夹也是NodeJS容器中的卷)。
1.将命令chown -R 0755 .应用于整个提取内容。
1.编辑docker-compose.yml文件(这里没有什么特别的;所有安装的volumes被标记为:rw-读-写)。
1.运行docker-compose up -d
运行docker-compose up -d后,我注意到volumes中指定的目录中的一些内容在容器中不存在(ls -la-空文件夹,但在解压缩的文件中,我看到这个文件夹不是空的。
为什么会发生这种情况,我该如何解决这个问题?
我已经试过了:
1.运行容器为root
1.授予privileged模式,
1.在docker-compose up -d之前添加sleep
1.改变chmod -R 0777 .chown www-data:www-data
1.将mv替换为cp
1.将:rw替换为:Z

UPD

基本操作系统:

# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"

字符串
基于node:20-slim的NodeJS容器(Debian 12)
基于php:8.2-fpm-alpine3.18的子容器

UPD

添加更多想法:
在我创建的容器中,我的用户是www-data。然而,在nodejs容器中,www-data用户的UID/GID = 33,而在alpine容器中,它的UID/GID = 82(也许这会导致冲突?).
我相信问题就在这里的某个地方,文件权限。

UPD:我在NodeJS容器中从Debian切换到Alpine,但问题仍然存在。
UPD:在容器中执行ls -la时,很明显某些文件夹(包含在卷中)的所有者是不同的用户。尝试使用chown -R 82:82 [folder]更改用户将导致错误chown: [folder]: Operation not permitted

但是,如果停止容器,然后从host machineroot用户执行docker-compose up -d,则容器启动,并且所有权限都是正确的。

snz8szmq

snz8szmq1#

Docker外的Docker
我怀疑你给docker-compose的目录是相对于docker-compose文件的。
您正在运行Docker Outside。这意味着用volumes:指定的目录是 * 外部 * 的目录,它们是运行docker守护进程的主机 * 上的目录。
因为volumes:默认创建一个空目录,所以很可能您在运行docker demon的主机上创建了一堆空目录。考虑使用形式volumes: - type: bind source: /dir target: /dir,以便当目录不存在作为保护时,docker失败,找不到目录。

相关问题