V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tlerbao
V2EX  ›  Docker

项目线上、Win 下环境没问题,在 Mac 的 Docker 下各种问题。

  •  
  •   tlerbao · 2021-02-20 20:27:35 +08:00 · 1322 次点击
    这是一个创建于 1407 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先报告本人菜鸡一枚 本来在 Mac 下使用 homestead 做开发环境写点 php 和 vue,听说 docker 各种神,最近开始折腾 docker,整体比较顺利,环境也都跑起来了。

    问题是一样的项目,一样的代码,线上和 Windows 下都没问题。

    在我这个 docker 下就有问题

    两个 php 容器 一个 7.3 一个 5.6,7.3 下的项目目前没发现问题,5.6 下的一个旧项目只要执行到阿里云 OSS uploadFile 方法就好像会让整个 php5.6 的容器挂掉,网站直接打不开了,代码和报错如下。

    try {
        $ossClient = new OssClient($config['accessKeyId'], $config['accessKeySecret'], $config['endpoint']);
        // 走到 uploadFile 就挂掉,是$file['tmp_name']文件、目录相关权限的问题?
        $res = $ossClient->uploadFile($config['bucket'], $ossFileName, $file['tmp_name']);
        //...
    

    docker 容器日志

    [20-Feb-2021 20:05:32] WARNING: [pool www] child 9, script '/www/ShengXin/CRM/index.php' (request: "POST /index.php") executing too slow (3.063820 sec), logging
    
    [20-Feb-2021 20:05:32] NOTICE: child 9 stopped for tracing
    
    [20-Feb-2021 20:05:32] NOTICE: about to trace 9
    
    [20-Feb-2021 20:05:32] ERROR: pread() failed: I/O error (5)
    
    [20-Feb-2021 20:05:32] NOTICE: finished trace of 9
    
    第 1 条附言  ·  2021-02-20 22:02:45 +08:00
    已经基本确认可能是 curl 问题,最终定位到如下代码

    ```
    // $curl_handle = resource(5) of type (curl)
    $curl_handle = $this->prep_request();
    // 容器里为何执行 curl_exec 就挂掉?
    $this->response = curl_exec($curl_handle);
    ```
    3 条回复    2021-02-21 14:20:57 +08:00
    leimao
        1
    leimao  
       2021-02-21 08:29:08 +08:00
    你这么一说,最近有个朋友在我项目里反映他用 Mac 做 Dockerfile Build 失败,但是我在 Linux 机器上根本重复不出他的问题。
    https://github.com/leimao/ONNX-Runtime-Inference/issues/1

    Windows 用 Docker 的话,如果没记错是基于 Linux 虚拟机的?虚拟机的话那问题一般不大。
    tlerbao
        2
    tlerbao  
    OP
       2021-02-21 08:54:39 +08:00
    @leimao
    经过一晚上的测试,发现原因似乎还有可能是目录或文件权限的问题,看下面注释说明,真的是奇怪了。
    ```
    $ossClient = new OssClient($config['accessKeyId'], $config['accessKeySecret'], $config['endpoint']);
    // 这里的第三个参数如果我写死,写成我在容器 /tmp 目录手动创建的文件 如 /tmp/test 代码就炮通了
    // 但是第三个参数如果写成下面这样 也就是$file['tmp_name'] 这个$file = $_FILES["file"],从表单选择的文件就会卡死
    $res = $ossClient->uploadFile($config['bucket'], $ossFileName, $file['tmp_name']);
    ```
    leimao
        3
    leimao  
       2021-02-21 14:20:57 +08:00
    @tlerbao Docker 普遍需要 root 权限。我没用过 Mac,但是 Mac 估计会有更严格的安全设定。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   948 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 20:55 · PVG 04:55 · LAX 12:55 · JFK 15:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.