专栏首页伪架构师(译)多数 Dockerfile 示例可能都不够严谨

(译)多数 Dockerfile 示例可能都不够严谨

想把 Python 应用打包成 Docker 镜像,很自然的行为就是上网搜个例子。简单的一搜,就能得出大量简单易懂的结果。

不幸的是这些简单方便的例子经常是有一些这样那样的缺陷,有的显而易见,有的可能就不那么明显了。为了发掘这些问题,本文中将要:

  1. 用一个在 Google 搜索结果中常见的 Dockerfile 开始。
  2. 展示其中的问题。
  3. 给出一些修复问题的建议。

本文的 Docerfile 仅用于解决这里发现的问题,不能算作最佳实践。

先天不足

看看下面的 Dockerfile,这是一个网上搜到的 Python 的容器化例子。做了一点点修改,来隐藏其出处,不过主干是一致的:

# DO NOT USE THIS DOCKERFILE AS AN EXAMPLE, IT IS BROKEN
FROM python:3

COPY yourscript.py /

RUN pip install flask

CMD [ "python", "./yourscript.py" ]

这个 Dockerfile 的一些问题

这个镜像中你能看到什么问题?

问题 1:Python 版本的不确定性

这里第一个需要注意的问题是,基础镜像是:python:3。在编写这个文件的时候,会安装 Python 3.7,但是可能未来某一天的重新构建,可能会变成 Python 3.8。这种版本切换,可能会让这一应用完全无法运行,从而打断了产品的交付过程。

建议:使用 python:3.7 作为基镜像。

问题 2:依赖库版本的不确定性

这里的 pip install flask,没有包含版本信息,所以每次重新构建,都可能升级成最新的 flask(或者 flask 的依赖,又或者 flask 的依赖的依赖)。保持兼容自然没问题,否则的话麻烦就大了。

建议:创建 requirements.txt,其中记载所有依赖的版本号,可以用 pip-tools 完成这一任务。

问题 3:代码的变更会让构建缓存失效

Docker 的层缓存对提高构件速度很有帮助。但是如果把 COPY 操作放在 pip install 前面,所有后续的层就都失效了,也就是说这一镜像会完全重新构建。

建议:在合适的时机进行文件复制。

问题 4:用 root 身份运行

缺省情况下,Docker 容器是用 root 身份运行的,这并不安全。

建议:如果不是有特定需要,例如监听 1024 以下的端口或者完成一些必须 root 身份的操作,建议使用非 root 账号。

改良版本

为了解决上面发现的几个问题,对 Dockerfile 做出如下修改:

FROM python:3.7

COPY requirements.txt /tmp/

RUN pip install -r /tmp/requirements.txt

RUN useradd --create-home appuser
WORKDIR /home/appuser
USER appuser

COPY yourscript.py .

CMD [ "python", "./yourscript.py" ]

这样改进了之后,也并不是就适合在生产环境中运行了,这个镜像还有一些不足。

例如,用一种受控的方式来对 requirements.txt 进行常规更新,以便进行安全更新和 Bug 修复,可能还要禁用缓存对镜像进行周期性重建,来获取安全加固。

参考链接

  • https://pythonspeed.com/articles/docker-cache-insecure-images/
  • https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
  • https://hynek.me/articles/python-app-deps-2018/

本文分享自微信公众号 - 伪架构师(fake-architect)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • K8S 分布式构建 Docker 镜像的一些小技巧

    崔秀龙
  • (译)为什么持续改进是持续交付的基础

    DevOps 的最大难题就是,DevOps 是永无止境的。并不存在一个(确切的)DevOps指南,也没有什么最终标志能够证明一个组织完成了 DevOps 的漫长...

    崔秀龙
  • Istio 大入门 - Ingress

    Istio 从 v1alpha3 开始,用 Ingress Gateway 组件替代了符合 Kubernetes 规范的 Ingress Controller,...

    崔秀龙
  • 给 python 初学者的四条忠告

    https://blog.csdn.net/xufive/article/details/102709538

    Python进击者
  • 环境搭建及介绍

    一:python下载     官网下载对应的版本,安装,设置坏境变量,设置环境变量有两种方法,一种方法是在PATH中添加路径,另一种方法稍后介绍。 二:运...

    py3study
  • windows7 python3和pyt

    Windows环境部署: https://www.lfd.uci.edu/~gohlke/pythonlibs/ Windows 环境下 whl库文件下载

    py3study
  • python学习1-Python内置下载

    py3study
  • 2018-03-24python3.6.2 Tensorflow环境配置(win10 64位)

    用户1733354
  • python大法之一-python是什么

    按照上面的程序安装之后,可能会碰到yum运行报错的问题,请修改 vim /usr/bin/yum 第一行的#!/usr/bin/python改为#!/usr/b...

    py3study
  • Anaconda完全入门指南 原

    很多学习python的初学者甚至学了有一段时间的人接触到anaconda或者其他虚拟环境工具时觉得无从下手, 其主要原因就是不明白这些工具究竟有什么用, 是用来...

    拓荒者

扫码关注云+社区

领取腾讯云代金券