我没有.dockerignore文件,但是Docker在构建时没有将资产文件夹复制到映像中。
项目:
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抛出此错误:
答案 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
。