如何优化Python Docker镜像大小

一直以来,使用普通方式打包的 Python 项目的 Docker 镜像都非常大,大概有一个多 G 的样子,比如下面这个例子。 FROM python:3 RUN mkdir -p /telsearch WORKDIR /telsearch COPY pyproject.toml poetry.lock /telsearch/ RUN pip3 install poetry ENV POETRY_VIRTUALENVS_CREATE false RUN poetry install --no-root --no-dev COPY . /telsearch 足足有 1.5 个 G,非常的浪费磁盘空间,那么,有没有什么方法可以减小镜像大小呢? 答案就是 Docker 的多阶段构建,官方文档在这里:https://docs.docker.com/develop/develop-images/multistage-build/。 FROM python:3.9 as builder RUN mkdir -p /telsearch WORKDIR /telsearch COPY pyproject.toml poetry.lock /telsearch/ ENV POETRY_VIRTUALENVS_CREATE false RUN pip3 install pip --upgrade && pip3 install poetry --upgrade --pre && poetry install --no-root --only main FROM python:3.9-slim WORKDIR /telsearch COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages COPY --from=builder /usr/local/bin/ /usr/local/bin/ COPY . /telsearch CMD ["uvicorn" ,"telsearch.app:app", "--host", "0.0.0.0"] 使用了新的方式打包之后,镜像大小减小到了 284MB,减小了非常之多。 ...

September 10, 2022

优雅地暴露Docker远程API

起因 最近在使用 portainer 管理多个机器上的 Docker 的时候,需要开启 docker 的远程 api 访问,但是如果直接开启的话会直接暴露到公网,容易被扫端口然后入侵机器,而自己生成 tls 证书什么的又比较麻烦,于是在 Google 搜索中发现了一个项目,https://github.com/kekru/docker-remote-api-tls。 简介 简单看了一下项目的介绍,其实就是通过容器内部的 nginx 对挂载进容器的docker.sock做了反代,并且提供了自动生成证书的功能,还不错,虽然只有几十颗星,不过正是我想要的。 部署 项目本身是一个 docker 项目,使用docker-compose就可以启动,并且项目里面也提供了示例。 version: "3.4" services: remote-api: image: kekru/docker-remote-api-tls:v0.4.0 ports: - 2376:443 environment: - CREATE_CERTS_WITH_PW=supersecret - CERT_HOSTNAME=remote-api.example.com volumes: - <local cert dir>:/data/certs - /var/run/docker.sock:/var/run/docker.sock:ro CREATE_CERTS_WITH_PW: 证书密码,随便设置一个就行。 CERT_HOSTNAME:证书的域名,需要和 portainer 里面的域名保持一直,不过好像不支持 ip,只能用域名。 然后执行docker compose up -d就启动了。 证书 启动后会在<local cert dir>生成证书文件,使用client子目录下面的文件就可以通过 api 连接了。 目录结构大概是这样: ❯ tree certs/ certs/ ├── ca-cert.pem ├── ca-key.pem ├── client │ ├── ca.pem │ ├── cert.pem │ └── key.pem ├── server-cert.pem └── server-key.pem 1 directory, 7 files

August 28, 2022

关于idea连接docker无法下载docker-java.jar问题解决

最近使用idea连接docker是遇到一个问题,就是一直无法连接,提示是无法从maven的中央仓库下载docker-java.jar。但是我的settings.xml已经更改为阿里云镜像了,那是因为什么呢?网上百度了一番没有找到答案,我猜测idea的maven默认使用的maven仓库并不是我们自己配置的,应该是idea自己确定的。 于是寻找了一番,最终定位到这个文件: 打开查看一番,果不然奇然是定义好的jar下载的仓库地址,于是改成阿里云的地址,像这样 再次连接docker,速度嗖嗖的就上来了,成功解决该问题。

May 12, 2017