修复Docker卷写入权限的问题

47次阅读
没有评论

问题描述

在使用基于 php:7.4-apache 镜像的 Docker 容器时,遇到了一个问题:应用无法写入 Docker 卷。他的容器有两个用于保存需要持久化的文件的 Docker 卷,并且在容器启动时,会运行 Certbot 来安装 HTTPS 证书。通过使用 ls -l 命令,他发现卷的挂载点是由用户 1451 拥有的。然而,他的 Web 服务器是以用户 www-data 运行的。尝试将容器运行用户更改为 www-data 解决了权限问题,但是这个解决方案导致 Certbot 无法在没有 root 权限的情况下获取 HTTPS 证书。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

解决方案1:创建新的镜像

这个问题可以通过创建一个新的镜像来解决,让这个新镜像的入口脚本修改卷的权限。以下是解决方案的步骤:

  1. 创建一个 entrypoint.sh 脚本文件,内容如下:
    bash
    #!/bin/bash
    chown www-data:www-data -R /path/to/volume_mountpoint
    apache2-foreground

    在这个脚本中,我们使用 chown 命令将卷的权限修改为 www-data:www-data,然后运行 Apache 服务器。

  2. 在 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 进行配置以满足权限要求。以下是解决方案的步骤:

  1. 在容器内创建一个新用户,用于运行 Certbot。假设这个用户叫做 certbotuser
    bash
    useradd -ms /bin/bash certbotuser

  2. 配置 Certbot 使用这个新用户运行。在执行 Certbot 命令时,使用 sudo 提升为 root 权限来运行 Certbot:
    bash
    sudo -u certbotuser certbot command-to-run-certbot

通过以上步骤,你可以保持容器以 www-data 用户运行,同时在执行 Certbot 命令时,使用一个特定的用户 certbotuser,这样就可以满足 Certbot 的权限要求。

总结

针对无法写入 Docker 卷的问题,你可以选择创建一个新的镜像,让入口脚本在容器启动时修改卷的权限,或者在容器内配置 Certbot 使用特定用户来满足权限要求。选择哪种方案取决于你的具体需求和偏好。

正文完