【问题标题】:Docker doesn't copy assets folderDocker 不复制资产文件夹
【发布时间】:2020-05-29 20:41:31
【问题描述】:

我没有 .dockerignore 文件,但 Docker 在构建时不会将 assets 文件夹复制到图像中。

项目:

  • 资产
    • 型号
      • v1
  • 源代码
  • venv
  • Dockerfile

App.py:

    import numpy as np
    import tensorflow as tf                                   
                                  [...]
    with open('../assets/model/v1/model_architecture_V1.json', 'r') as f:
        model_json = f.read()

    model.load_weights("../assets/model/v1/model_weight_V1.h5")

                                  [...]

    if __name__ == '__main__':
       app.run(host='0.0.0.0', port=4000, debug=True)

Docker 文件:

    FROM python:3

    WORKDIR /app

    COPY requirements.txt ./
    RUN pip install --no-cache-dir -r requirements.txt

    COPY . .

    CMD ["python3","src/app.py"]

当我运行项目映像时,Python 会抛出这个错误:

  • 当我在没有 Docker 的情况下运行应用程序时没有问题。

【问题讨论】:

  • 如果你是具体的,COPY ./assets /assets 等呢?
  • 正如 Docker 文档中所解释的“目录本身没有被复制,只是它的内容。”。你的资产目录是包含文件还是空的?
  • 本地运行时,是在src目录还是上面的目录?我希望 ../assets 路径被解释为相对于当前目录,而不一定是脚本目录。
  • 你能用你得到的错误的实际文本替换那个图像吗?

标签: python docker docker-compose dockerfile


【解决方案1】:
CMD ["python3","src/app.py"]

请注意此声明,您在src 文件夹外运行app.py 脚本,但不在src 文件夹内。 所以open() 函数采用绝对路径或相对路径。当涉及到相对路径时,您需要提供运行 python 脚本 app.py 的路径,因为您在 src 文件夹之外运行,因此,您的路径也应该以相同的方式给出。所以会是assests/models/v1/model_architecture_V1.json

与docker文件无关或者是这里的位置。您应该了解容器中目录的复制和移动是如何发生的,然后还要了解 python 的性质,您需要根据运行脚本的位置提供相对路径,而不是相对于脚本的位置python脚本app.py

【讨论】:

    【解决方案2】:

    当你在本地测试时设置../assets/.. 是有效的。但是在 Docker 构建期间,Dockerfile 和 assets 文件夹都位于同一级别。因此,您必须将文件路径更改为assets/..。要在 Python 中有效地处理这个问题,请检查 os.path.join

        Step 3/6 : COPY . .
        ---> 49a93d46bdde
        Step 4/6 : RUN ls -lah
         ---> Running in f57d57b59dce
        total 24K
        drwxr-xr-x 1 root root 4.0K May 29 21:21 .
        drwxr-xr-x 1 root root 4.0K May 29 21:21 ..
        -rw-r--r-- 1 root root  168 May 29 21:19 Dockerfile
        drwxr-xr-x 3 root root 4.0K May 29 20:53 assests
        drwxr-xr-x 2 root root 4.0K May 29 21:21 src
        drwxr-xr-x 2 root root 4.0K May 29 20:54 venv
    
        ---
    
        with open('assests/models/v1/model_architecture_V1.json', 'r') as f:
           model_json = f.read()
    

    样本输出

    docker run harik8/app:latest                  
    {
        "glossary": {
            "title": "example glossary",
                    "GlossDiv": {
                "title": "S",
                            "GlossList": {
                    "GlossEntry": {
                        "ID": "SGML",
                                            "SortAs": "SGML",
                                            "GlossTerm": "Standard Generalized Markup Language",
                                            "Acronym": "SGML",
                                            "Abbrev": "ISO 8879:1986",
                                            "GlossDef": {
                            "para": "A meta-markup language, used to create markup languages such as DocBook.",
                                                    "GlossSeeAlso": ["GML", "XML"]
                        },
                                            "GlossSee": "markup"
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多