如何解决Docker 容器在共享目录中看不到移动的文件
我在 Docker 设置上安装了 WordPress,在不同的容器中使用 Nginx 和 PHP-FPM。两者共享一个已安装的卷,两者都在具有相同 ID 和 GID 的用户 wp
下运行。除了 PHP 容器移动文件时遇到的这个令人困惑的问题外,一切正常。
我制作了一个 PHP 脚本,可以将图像导入我的网站。在主机上,作为用户 administrator
,我将要导入的文件复制到 inbox
文件夹中,然后通过浏览器在 PHP 容器上运行脚本。导入会将 JPEG 从 inbox
移动到同一卷 images
中的另一个文件夹。之后,PHP 和 Nginx 容器上的 shell 都看不到文件(虽然奇怪的是它们知道文件的名称),并且尝试在浏览器中查看图像的结果非常一致,结果是 404,除了一两个间歇性的成功请求.
导入前的收件箱文件夹,来自主机:
.rw-r--r--@ 3.7M administrator 30 Apr 8:19 trees-upwards.jpg
来自 PHP 容器:
-rw-r--r-- 1 wp wp 3651651 Apr 30 07:19 trees-upwards.jpg
来自 Nginx 容器:
-rw-r--r-- 1 wp wp 3651651 Apr 30 07:19 trees-upwards.jpg
当我访问以 uploads/inbox/trees-upwards.jpg
结尾的 URL 时,我可以在浏览器中看到图像。
导入后的目标文件夹,来自主机:
.rw-r--r--@ 3.7M administrator 30 Apr 8:19 trees-upwards.jpg
来自 PHP 容器:
ls: images/trees-upwards.jpg: No such file or directory
来自 Nginx 容器:
ls: images/trees-upwards.jpg: No such file or directory
当我尝试在 uploads/images/trees-upwards.jpg
处查看图像时,我初步看到了它,但是当我刷新时,始终是 404。
- 在运行脚本之前,我已尝试将主机中图像的所有者和组设置为与
wp
相同的 ID 和 GID,但我得到了相同的结果。 - 我还尝试使用
shell_exec( "mv $path $new_path" );
而不是rename
移动文件。 - 我也试过
shell_exec( "chown wp:wp $path; mv $path $new_path );"
。 - 通过 WordPress 媒体库上传页面上传图片效果很好。
脚本所做的只是使用 rename
移动文件——它不会对所有者或权限进行任何更改。
有没有人遇到过这种问题?
解决方法
问题在于我移动文件的方式。我检查了 WordPress 是如何做到的:在它用来将上传的文件移动到上传文件夹的 _wp_handle_upload
函数中,有一点:
if ( 'wp_handle_upload' === $action ) {
$move_new_file = @move_uploaded_file( $file['tmp_name'],$new_file );
} else {
// Use copy and unlink because rename breaks streams.
// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
$move_new_file = @copy( $file['tmp_name'],$new_file );
unlink( $file['tmp_name'] );
}
当我把我的PHP代码改成先复制,再删除原文件
@copy( $path,$new_path );
unlink( $path );
一切正常。我不知道流是如何工作的。我确实在某处读到 rename
在旧版本的 PHP 上不能正常工作,但我运行的是 7.4。我很高兴我找到了一种可以实现我想要的方法。希望这对其他人有帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。