我有一个在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 machine
的root
用户执行docker-compose up -d
,则容器启动,并且所有权限都是正确的。
1条答案
按热度按时间snz8szmq1#
Docker外的Docker
我怀疑你给docker-compose的目录是相对于docker-compose文件的。
您正在运行Docker Outside。这意味着用
volumes:
指定的目录是 * 外部 * 的目录,它们是运行docker守护进程的主机 * 上的目录。因为
volumes:
默认创建一个空目录,所以很可能您在运行docker demon的主机上创建了一堆空目录。考虑使用形式volumes: - type: bind source: /dir target: /dir
,以便当目录不存在作为保护时,docker失败,找不到目录。