问题描述
在使用基于 php:7.4-apache
镜像的 Docker 容器时,遇到了一个问题:应用无法写入 Docker 卷。他的容器有两个用于保存需要持久化的文件的 Docker 卷,并且在容器启动时,会运行 Certbot 来安装 HTTPS 证书。通过使用 ls -l
命令,他发现卷的挂载点是由用户 1451
拥有的。然而,他的 Web 服务器是以用户 www-data
运行的。尝试将容器运行用户更改为 www-data
解决了权限问题,但是这个解决方案导致 Certbot 无法在没有 root
权限的情况下获取 HTTPS 证书。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
解决方案1:创建新的镜像
这个问题可以通过创建一个新的镜像来解决,让这个新镜像的入口脚本修改卷的权限。以下是解决方案的步骤:
创建一个
entrypoint.sh
脚本文件,内容如下:
bash
#!/bin/bash
chown www-data:www-data -R /path/to/volume_mountpoint
apache2-foreground
在这个脚本中,我们使用chown
命令将卷的权限修改为www-data:www-data
,然后运行 Apache 服务器。在 Dockerfile 中创建新的镜像:
Dockerfile
FROM php:7.4-apache
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
在这个 Dockerfile 中,我们首先继承了基础镜像php:7.4-apache
,然后将entrypoint.sh
脚本复制到镜像中,并使用ENTRYPOINT
指令来指定入口脚本。
通过以上步骤,当容器启动时,入口脚本将会执行,并将卷的权限修改为 www-data:www-data
,这样应用就能够以正确的权限写入卷中。
解决方案2:添加特定用户
这个方案不需要修改镜像或入口脚本,但需要对 Certbot 进行配置以满足权限要求。以下是解决方案的步骤:
在容器内创建一个新用户,用于运行 Certbot。假设这个用户叫做
certbotuser
:
bash
useradd -ms /bin/bash certbotuser配置 Certbot 使用这个新用户运行。在执行 Certbot 命令时,使用
sudo
提升为root
权限来运行 Certbot:
bash
sudo -u certbotuser certbot command-to-run-certbot
通过以上步骤,你可以保持容器以 www-data
用户运行,同时在执行 Certbot 命令时,使用一个特定的用户 certbotuser
,这样就可以满足 Certbot 的权限要求。
总结
针对无法写入 Docker 卷的问题,你可以选择创建一个新的镜像,让入口脚本在容器启动时修改卷的权限,或者在容器内配置 Certbot 使用特定用户来满足权限要求。选择哪种方案取决于你的具体需求和偏好。