代码之家  ›  专栏  ›  技术社区  ›  learningtech

docker容器中的PHP file_put_contents()无法写入底层的ubuntu操作系统

  •  0
  • learningtech  · 技术社区  · 1 年前

    我正在学习使用Docker来托管php应用程序。我试着做一个简单的 index.php 这将写一个 hello world test.txt 文件到我的底层ubuntu操作系统。但无论我做什么,我都会遇到很多问题。我从以下3个文件开始:

    // ~/docker/docker-compose.yml
    version: "3.8"
    services:
      website:
        container_name: website
        build:
          context: ./
          dockerfile: Dockerfile
        ports:
          - "80:80"
        volumes:
          - ../public_html:/var/www/html
        logging:
          options:
            max-file: "10"
            max-size: 10m
    
    // ~/docker/Dockerfile
    FROM php:5.4-apache
    
    RUN chown -R www-data:www-data /var/www/html
    
    CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
    
    // ~/public_html/index.php
    
    <?php file_put_contents('test.txt', 'hello world');
    

    我使用以下“启动”命令启动项目:

    john@localhost: sudo su
    root@localhost: systemctl start docker
    root@localhost: exit
    john@localhost: sudo chown -R john:john ~/docker
    john@localhost: sudo chown -R john:john ~/public_html
    john@localhost: sudo chmod -R 755 ~/public_html
    john@localhost: cd ~/docker
    john@localhost: sudo docker-compose up --build -d;
    

    用户 john sudo 特权。

    当我访问我的网页时 http://192.168.0.10/index.php ,我看到错误消息

    Warning: file_put_contents(test.txt): failed to open stream: Permission denied in /var/www/html/index.php on line 1
    

    我可以通过在我的ubuntu主机上运行以下命令来解决这个问题:

    touch ~/public_html/test.txt && chmod 777 ~/public_html/test.txt
    

    但我真的想保留 755

    我读到我必须保留所有 user ids 在我的主机ubuntu机器和来宾容器之间对齐。所以我尝试了一些方法,但每次尝试都会导致docker容器失败,甚至无法启动。这是我最近的一次尝试,同时出现了错误:

    // ~/docker/.env
    // when I did `id -u`, i saw the value 1000.  So I will assign it to an env variable
    CURRENT_UID=1000
    
    // ~/docker/docker-compose.yml
    version: "3.8"
    services:
      website:
        container_name: website
        user: ${CURRENT_UID}
        environment:
          CURRENT_UID: ${CURRENT_UID}
        build:
          context: ./
          dockerfile: Dockerfile
        ports:
          - "80:80"
        volumes:
          - ../public_html:/var/www/html
        logging:
          options:
            max-file: "10"
            max-size: 10m
    
    // ~/docker/Dockerfile
    FROM php:5.4-apache
    
    USER ${CURRENT_UID}:${CURRENT_UID}
    RUN chown -R ${CURRENT_UID}:${CURRENT_UID} /var/www/html
    RUN chown -R ${CURRENT_UID}:${CURRENT_UID} /etc/apache2
    RUN chown -R ${CURRENT_UID}:${CURRENT_UID} /var/log/apache2
    RUN chown -R ${CURRENT_UID}:${CURRENT_UID} /var/run/apache2
    
    CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
    

    当我运行“启动”命令时,容器无法启动。我做了一个 sudo docker logs website 它显示:

    [Wed Jun 28 23:01:18.623744 2023] [core:error] [pid 7] (13)Permission denied: AH00099: could not create /var/run/apache2/apache2.pid
    [Wed Jun 28 23:01:18.623918 2023] [core:error] [pid 7] AH00100: apache2: could not log pid to file /var/run/apache2/apache2.pid
    Action '-D FOREGROUND' failed.
    The Apache error log may have more information
    

    有人能告诉我我做错了什么吗?有没有办法在容器出现故障后查看Apache错误日志?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Sammitch    1 年前

    Docker不尊重主机系统的 passwd config,并且不作为 你的 UID,它以映像中恰好配置的任何用户的身份运行,映像映射到 图像的 密码 文件在这种情况下,映像以root身份运行以启动apache,然后根据其配置对www数据[UID/GID 33]执行setuid/setgid。

    使用后 chmod 777 你应该能够看到创建文件的UID/GID ls -an

    您需要:

    • 将已装入卷的所有权更改为UID/GID 33,例如 chown -R 33:33 ~/public_html
    • 自定义映像以添加UID/GID与要使用的主机UID/GIID匹配的用户/组,然后将apache配置为以该用户身份运行。