使用 docker-compose 时,WordPress 容器启动失败,其中存在现有的 WordPress 文件,并中止并出现以下错误:
sed: cannot rename ./sedtpghTB: Operation not permitted
仅当 WordPress 文件托管在 VirtualBox (vboxsf) 共享文件夹中时才会发生错误。通过 SMB/CIFS 共享文件夹可避免该错误。
设置:
- 主机:Win 10(64b)
- 客户机:3.16.0-4-amd64(debian_version 8.6)客户机/Vbox 版本:5.1.12 r112440(Qt5.6.2)
- WordPress 文件使用安装在以下位置的 VirtualBox 共享文件夹进行共享
/media/vmhost
以下是 docker-compose 配置的输出:
networks: {}
services:
db:
environment:
MYSQL_DATABASE: my_db_name
MYSQL_PASSWORD: 'MY_ROOT_PASSWORD'
MYSQL_ROOT_PASSWORD: 'MY_ROOT_PASSWORD'
MYSQL_USER: root
image: mysql:5.7
ports:
- 3306:3306
restart: never
volumes:
- db_data:/var/lib/mysql:rw
wordpress:
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: my_db_name
WORDPRESS_DB_PASSWORD: 'MY_PASSWORD'
WORDPRESS_DB_USER: root
image: wordpress:latest
ports:
- 80:80
restart: never
volumes:
- /media/vmhost/www/test:/var/www:rw
- /media/vmhost/www/test/public_html:/var/www/html:rw
version: '2.0'
volumes:
db_data: {}
wp_data: {}
当我尝试在 vboxsf 共享上使用 sed 时,出现了类似的错误,但仅当源文件是只读时才会出现。
echo 'hello' > hello.txt
chmod a-w hello.txt
sed -i 's/hello/goodbye/' hello.txt
错误:
sed: cannot rename ./sed6x9apB: Operation not permitted
mount | grep www 的输出
www on /media/vmhost/www type vboxsf (rw,nodev,relatime)
当我使用安装在 /media/vmhost/www2 的 CIFS 共享时,一切正常。
//my_laptop/www on /media/vmhost/www2 type cifs (rw,relatime,vers=1.0,sec=ntlm,cache=strict,username=vboxsf,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.1.5,file_mode=0777,dir_mode=0777,nounix,serverino,noperm,rsize=61440,wsize=65536,actimeo=1)
答案1
这似乎是 VirtualBox 的一个错误,请参阅票号 #4890。
根据弗兰克的回复:
Linux 主机已修复,但 Windows 主机尚未修复。Linux 中,如果目录可写但文件本身是只读的,则可以删除文件,而 Windows 上则无法删除只读文件
这会影响 sed,因为 sed 将源文件(在本例中为 wp-config-sample.php )复制到临时文件,然后尝试进行替换,但由于该副本也是只读的,因此 Windows 不支持替换。
由于某种原因,使用 CIF 的正确共享不会受到影响。
解决方法 1:使源文件可写并重新启动容器。
chmod a+w wp-config-sample.php docker-compose up
解决方法 2:使用 CIFS 共享。
- 在 Windows 机器上,使用目录的 Windows 高级共享属性共享包含 WordPress 文件的目录。
在 VirtualBox VM 上,将以下内容添加到 /etc/fstab
//my_laptop/www /media/vmhost/www cifs username=WINDOWS_USER,password=WINDOWS_USER_PASSWORD,file_mode=0777,dir_mode=0777,iocharset=utf8,noperm,sec=ntlm 0 0
山
mount -a