首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PHP将用户上传的文件保存到挂载卷中?

问如何使用PHP将用户上传的文件保存到挂载卷中?
EN

Stack Overflow用户
提问于 2020-02-05 13:40:53
回答 2查看 1.5K关注 0票数 0

我有一个灯堆栈配置的对接-合成,并有问题,保存用户上传的文件到一个挂载的卷,以持久存储。这是我的撰写文件:

代码语言:javascript
复制
    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代码中,我尝试将文件保存到卷中:

代码语言:javascript
复制
    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写入权限挂载的卷?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-05 18:41:43

我在@Nguyen的指导下找到了一个解决方案,尽管在我的情况下还有更多,所以我想我会写我自己的详细答案,以防它可能对某人有帮助。

如果您在MacOS上使用Docker,那么Docker实际上是在Linux上运行,而不是在机器上运行。这使我在试图更改主机上的权限(从docker的角度来看主机是VM)时被绊倒了。

我发现了使用以下函数执行PHP脚本的用户和组id:

代码语言:javascript
复制
echo posix_getuid();
echo posix_getgid();

我使用以下命令找到了我的卷的挂载位置:

代码语言:javascript
复制
docker volume inspect nameofyourvolume

当我尝试刷新卷被装入的目录(/var/lib/docker/卷)时,我得到的是“没有这样的文件或目录”。在进行了一些研究之后,我意识到挂载位置的路径相对于正在运行的VM停靠器。我找到了一种使用以下命令进入这个VM的方法(请参阅https://www.bretfisher.com/docker-for-mac-commands-for-getting-into-local-docker-vm/):

代码语言:javascript
复制
docker run -it --rm --privileged --pid=host justincormack/nsenter1

这将您放入具有对VM的完全权限的容器中。然后,您可以像往常一样,将权限更改为保存卷的目录。

票数 3
EN

Stack Overflow用户

发布于 2020-02-05 14:19:53

我试图更改卷的权限,但没有效果。是否有任何方式给PHP写入权限挂载的卷?

简而言之,在您的方案上下文中,无法从码头容器中更改已挂载卷的权限。您需要从主机级别执行此操作。

当主机是基于Linux的(例如RedHat、Ubuntu)时,当它在MacOS上正常工作时,通常会发生这个问题。你需要:

  • 查找停靠容器中的哪个用户id正在运行该命令。
  • 确保主机上的同一个用户id具有足够的权限在已挂载的文件夹中创建文件。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60077152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档