总结

  • 多级打包,使用多个 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”]

  1. <a name="7KKwr"></a>
  2. # Python 入口文件
  3. - 使用 `argparse` 接收参数;
  4. - `input_csv = f"/batch_test/{args.csv}"` 中的 batch_test 是镜像中的位置,所以这个入口文件不能在不打镜像时直接运行的。
  5. ```python
  6. parser = argparse.ArgumentParser()
  7. parser.add_argument('--service')
  8. parser.add_argument("--csv")
  9. args = parser.parse_args()
  10. if args.service == "hz_risk_model_service":
  11. print(f"it is ready to run {args.service}")
  12. input_csv = f"/batch_test/{args.csv}"
  13. output_csv = f"/batch_test/{time.strftime('%m%d-%H-%M-%S')}.xlsx"
  14. ins = ScriptHuizuModel(input_csv, output_csv)
  15. ins.main(rsa_prv_key=rsa_prv_key, aes_key=aes_key, company_uuid=company_uuid)
  16. else:
  17. print(args.service, "is not set.")

容器启动命令

难点

如何接收一个外界文件,输出后也保存在外界呢?
挂载宿主机上的路径。所以最终的启动命令如下:

  1. 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

启动命令更正

  1. # batch_test 是根目录,这必须写成宿主机的根目录
  2. docker run --rm -v (替换为 biz_data.csv 所在的目录):/batch_test
  3. # 如果挂载为根目录,安装以为的用法要谢伟:input/biz_data.csv
  4. batch_test:latest --service=hz_risk_model_service --csv=biz_data.csv