总结
- 多级打包,使用多个 FROM
- 使用
ENTRYPOINT
, 接收 command line arguments ENTRYPOINT
执行镜像内文件,文件的位置写法。COPY
时把文件拷贝到某一个文件夹下,这样便于指定路径,如果放在根目录下,挂载时不能挂载镜像的根目录,写成宿主机:/
这种会抛出异常。- Python 的基础镜像选型;
- Python 使用阿里云镜像加速
Dockerfile
```dockerfile FROM python:3.7.2-slim-stretch as base
RUN mkdir -p /root/.pip RUN echo “[global]” > /root/.pip/pip.conf && \ echo “index-url = http://mirrors.aliyun.com/pypi/simple/“ >> /root/.pip/pip.conf && \ echo “[install]” >> /root/.pip/pip.conf && \ echo “trusted-host=mirrors.aliyun.com” >> /root/.pip/pip.conf COPY requirement.txt . RUN pip install -r requirement.txt -i http://mirrors.aliyun.com/pypi/simple/ —extra-index-url https://pypi.python.org/simple —trusted-host mirrors.aliyun.com FROM base RUN mkdir batch_test VOLUME /var/batch_test COPY . /batch_test RUN rm -rf /batch_test/venv ENTRYPOINT [“python”, “/batch_test/run.py”]
<a name="7KKwr"></a>
# Python 入口文件
- 使用 `argparse` 接收参数;
- `input_csv = f"/batch_test/{args.csv}"` 中的 batch_test 是镜像中的位置,所以这个入口文件不能在不打镜像时直接运行的。
```python
parser = argparse.ArgumentParser()
parser.add_argument('--service')
parser.add_argument("--csv")
args = parser.parse_args()
if args.service == "hz_risk_model_service":
print(f"it is ready to run {args.service}")
input_csv = f"/batch_test/{args.csv}"
output_csv = f"/batch_test/{time.strftime('%m%d-%H-%M-%S')}.xlsx"
ins = ScriptHuizuModel(input_csv, output_csv)
ins.main(rsa_prv_key=rsa_prv_key, aes_key=aes_key, company_uuid=company_uuid)
else:
print(args.service, "is not set.")
容器启动命令
难点
如何接收一个外界文件,输出后也保存在外界呢?
挂载宿主机上的路径。所以最终的启动命令如下:
docker run --rm -v (替换为 biz_data.csv 所在的目录):/batch_test batch_test:latest --service=hz_risk_model_service --csv=biz_data.csv
赋能文档
https://www.yuque.com/kougazhang/work-private/myg5bi
启动命令更正
# batch_test 是根目录,这必须写成宿主机的根目录
docker run --rm -v (替换为 biz_data.csv 所在的目录):/batch_test
# 如果挂载为根目录,安装以为的用法要谢伟:input/biz_data.csv
batch_test:latest --service=hz_risk_model_service --csv=biz_data.csv