我有一个灯堆栈配置的对接-合成,并有问题,保存用户上传的文件到一个挂载的卷,以持久存储。这是我的撰写文件:
version: '3.7'
services:
php-apache:
build: './php-apache'
restart: always
ports:
- 5000:80
volumes:
- ./public_html:/var/www/html
- ./composer/vendor:/var/www/html/vendor
- ./tmp:/usr/local/tmp
- ./cert/:/usr/local/apache2/cert
- covers:/var/lib/app-data/covers:rw
- ebooks:/var/lib/app-data/ebooks:rw
depends_on:
- mysql
- composer
mysql:
build: './mysql'
restart: always
ports:
- '33061:3306'
volumes:
- ./database:/var/lib/mysql
- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
environment:
MYSQL_ROOT_PASSWORD: secretpw
MYSQL_USER: myuser
MYSQL_PASSWORD: mypw
MYSQL_DATABASE: mydb
composer:
build: './composer'
working_dir: /composer
volumes:
- ./composer:/composer
command: install
volumes:
covers: {}
ebooks: {}在我的PHP代码中,我尝试将文件保存到卷中:
if (!move_uploaded_file($_FILES[$file]['tmp_name'], $path . $filename)) {
throw new RuntimeException("Failed to move uploaded file.");
}我得到了以下错误:
move_uploaded_file(/var/lib/app-data/covers/useruploadedfile.jpg):未能打开流:权限被拒绝
我试图更改卷的权限,但没有效果。是否有任何方式给PHP写入权限挂载的卷?
发布于 2020-02-05 18:41:43
我在@Nguyen的指导下找到了一个解决方案,尽管在我的情况下还有更多,所以我想我会写我自己的详细答案,以防它可能对某人有帮助。
如果您在MacOS上使用Docker,那么Docker实际上是在Linux上运行,而不是在机器上运行。这使我在试图更改主机上的权限(从docker的角度来看主机是VM)时被绊倒了。
我发现了使用以下函数执行PHP脚本的用户和组id:
echo posix_getuid();
echo posix_getgid();我使用以下命令找到了我的卷的挂载位置:
docker volume inspect nameofyourvolume当我尝试刷新卷被装入的目录(/var/lib/docker/卷)时,我得到的是“没有这样的文件或目录”。在进行了一些研究之后,我意识到挂载位置的路径相对于正在运行的VM停靠器。我找到了一种使用以下命令进入这个VM的方法(请参阅https://www.bretfisher.com/docker-for-mac-commands-for-getting-into-local-docker-vm/):
docker run -it --rm --privileged --pid=host justincormack/nsenter1这将您放入具有对VM的完全权限的容器中。然后,您可以像往常一样,将权限更改为保存卷的目录。
发布于 2020-02-05 14:19:53
我试图更改卷的权限,但没有效果。是否有任何方式给PHP写入权限挂载的卷?
简而言之,在您的方案上下文中,无法从码头容器中更改已挂载卷的权限。您需要从主机级别执行此操作。
当主机是基于Linux的(例如RedHat、Ubuntu)时,当它在MacOS上正常工作时,通常会发生这个问题。你需要:
https://stackoverflow.com/questions/60077152
复制相似问题