Docker不复制资产文件夹

时间:2020-05-29 20:41:31

标签: python docker docker-compose dockerfile

我没有.dockerignore文件,但是Docker在构建时没有将资产文件夹复制到映像中。

项目:

  • 资产
    • 型号
      • v1
  • src
  • 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)

Dockerfile:

    FROM python:3

    WORKDIR /app

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

    COPY . .

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

当我运行项目图像时,Python抛出此错误:

enter image description here

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

2 个答案:

答案 0 :(得分:1)

在本地测试时,../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"
                }
            }
        }
    }
}

答案 1 :(得分:1)

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

观察此语句,您正在app.py文件夹外而不是src文件夹内运行src脚本。 因此open()函数采用绝对路径或相对路径。当涉及到相对路径时,您需要提供从app.py文件夹外部运行时开始运行python脚本src的路径,因此,还应该给您相同的路径道路。因此它将是assests/models/v1/model_architecture_V1.json

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