3 Star 22 Fork 3

ACI for CN / Minit

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

minit

一个用 Go 编写的进程管理工具,用以在容器内启动多个进程

获取镜像

guoyk/minit:VERSION

使用方法

使用多阶段 Dockerfile 来从上述镜像地址导入 minit 可执行程序

FROM guoyk/minit AS minit

FROM xxxxxxx

# 添加一份服务配置到 /etc/minit.d/
ADD my-service.yml /etc/minit.d/my-service.yml
# 这将从 minit 镜像中,将可执行文件 /minit 拷贝到最终镜像的 /minit 位置
COPY --from=minit /minit /minit
# 这将指定 /minit 作为主启动入口,允许后续的 CMD 传入
ENTRYPOINT ["/minit"]

配置文件

配置文件默认从 /etc/minit.d/*.yml 读取

允许使用 --- 分割在单个 yaml 文件中,写入多条配置单元

当前支持以下类型

  • render

    render 类型配置单元最先运行(优先级 L1),一般用于渲染配置文件,可使用函数参考 [pkg/mtmpl/funcs.go] 文件

    如下示例

    /etc/minit.d/render-test.yml

    kind: render
    name: render-test
    files:
        - /tmp/*.txt

    /tmp/sample.txt

    Hello, {{stringsToUpper .Env.HOME}}

    minit 启动时,会按照配置规则,渲染 /tmp/sample.txt 文件

    由于容器用户默认为 root,因此 /tmp/sample.txt 文件会被渲染为

    Hello, /ROOT

    可用渲染函数,参见代码中的 pkg/tmplfuncs/tmplfuncs.go

  • once

    once 类型的配置单元随后运行(优先级 L2),用于执行一次性进程

    /etc/minit.d/sample.yml

    kind: once
    name: once-sample
    dir: /work # 指定工作目录
    command:
        - echo
        - once
  • daemon

    daemon 类型的配置单元,最后启动(优先级 L3),用于执行常驻进程

    kind: daemon
    name: daemon-sample
    dir: /work # 指定工作目录
    count: 3 # 如果指定了 count,会启动多个副本
    command:
        - sleep
        - 9999
  • cron

    cron 类型的配置单元,最后启动(优先级 L3),用于按照 cron 表达式,执行命令

    kind: cron
    name: cron-sample
    cron: "* * * * *"
    immediate: true # 启动后立即执行一次
    dir: /work # 指定工作目录
    command:
        - echo
        - cron

日志文件

minit 会把每个单元的日志记录在 /var/log/minit 文件夹内,使用环境变量 MINIT_LOG_DIR 来修改这个目录

设置 MINIT_LOG_DIR=none 禁用日志文件功能,同时缩减内存使用量,优化标准输出性能

日志字符集转换

上述所有配置单元,均可以追加 charset 字段,会将命令输出的日志,从其他字符集转义到 utf-8

当前支持

  • gbk18030
  • gbk

增加环境变量

once, daemoncron 类型的单元中,可以使用 env 字段增加额外的环境变量

比如

kind: daemon
name: demo-daemon-1
env:
  AAA: BBB
command:
  - echo
  - $AAA

渲染环境变量

凡是以 MINIT_ENV_ 为前缀开头的环境变量,会执行模板渲染,并传递给进程,可使用函数参考 [pkg/mtmpl/funcs.go] 文件。

比如:

MINIT_ENV_MY_IP={{netResolveIP "google.com"}}

会设置对应的环境变量

MY_IP=172.217.160.110

使用 Shell

上述配置单元的 command 数组默认状态下等价于 argv 系统调用,如果想要使用基于 Shell 的多行命令,使用以下方式

name: demo-for-shell
kind: once
# 追加要使用的 shell
shell: "/bin/bash -eu"
command:
  - if [ -n "${HELLO}" ]; then
  - echo "world"
  - fi

支持所有带 command 参数的工作单元类型,比如 once, daemon, cron

快速创建单元

如果懒得写 YAML 文件,可以直接用环境变量,或者 CMD 来创建 daemon 类型的配置单元

使用环境变量创建单元

MINIT_MAIN=redis-server /etc/redis.conf
MINIT_MAIN_DIR=/work
MINIT_MAIN_NAME=main-program
MINIT_MAIN_GROUP=super-main
MINIT_MAIN_KIND=cron
MINIT_MAIN_CRON="* * * * *"
MINIT_MAIN_IMMEDIATE=true
MINIT_MAIN_CHARSET=gbk18030

使用命令行参数创建单元

ENTRYPOINT ["/minit"]
CMD ["redis-server", "/etc/redis.conf"]

打开/关闭单元

可以通过环境变量,打开/关闭特定的单元

  • MINIT_ENABLE, 逗号分隔, 如果值存在,则为 白名单模式,只有指定名称的单元会执行
  • MINIT_DISABLE, 逗号分隔, 如果值存在,则为 黑名单模式,除了指定名称外的单元会执行

可以为配置单元设置字段 group,然后在上述环境变量使用 @group ,设置一组单元的开启和关闭。

使用 &daemon 这样的格式,控制一个类型的控制单元的开启和关闭

没有设置 group 字段的单元,默认组名为 default

快速退出

默认情况下,即便是没有 L3 类型任务 (daemon, cron, logrotate 等),minit 也会持续运行,以支撑起容器主进程。

如果要在 initContainers 中,或者容器外使用 minit,可以将环境变量 MINIT_QUICK_EXIT 设置为 true

此时,如果没有 L3 类型任务,minit 会自动退出

资源限制 (ulimit)

注意,使用此功能可能需要容器运行在高权限 (Privileged) 模式

使用环境变量 MINIT_RLIMIT_XXXX 来设置容器的资源限制,unlimited 代表无限制, - 表示不修改

比如:

MINIT_RLIMIT_NOFILE=unlimited       # 同时设置软硬限制为 unlimited
MINIT_RLIMIT_NOFILE=128:unlimited   # 设置软限制为 128,设置硬限制为 unlimited
MINIT_RLIMIT_NOFILE=128:-           # 设置软限制为 128,硬限制不变
MINIT_RLIMIT_NOFILE=-:unlimited     # 软限制不变,硬限制修改为 unlimited

可用的环境变量有:

MINIT_RLIMIT_AS
MINIT_RLIMIT_CORE
MINIT_RLIMIT_CPU
MINIT_RLIMIT_DATA
MINIT_RLIMIT_FSIZE
MINIT_RLIMIT_LOCKS
MINIT_RLIMIT_MEMLOCK
MINIT_RLIMIT_MSGQUEUE
MINIT_RLIMIT_NICE
MINIT_RLIMIT_NOFILE
MINIT_RLIMIT_NPROC
MINIT_RLIMIT_RTPRIO
MINIT_RLIMIT_SIGPENDING
MINIT_RLIMIT_STACK

内核参数 (sysctl)

注意,使用此功能可能需要容器运行在高权限 (Privileged) 模式

使用环境变量 MINIT_SYSCTL 来写入 sysctl 配置项,minit 会自动写入 /proc/sys 目录下对应的参数

使用 , 分隔多个值

比如:

MINIT_SYSCTL=vm.max_map_count=262144,vm.swappiness=60

透明大页 (THP)

注意,使用此功能可能需要容器运行在高权限 (Privileged) 模式,并且需要挂载 /sys 目录

使用环境变量 MINIT_THP 修改 透明大页配置,可选值为 never, madvisealways

WebDAV 服务

我懂你的痛,当你在容器里面生成了一份调试信息,比如 Arthas 或者 Go pprof 的火焰图,然后你开始绞尽脑汁想办法把这个文件传输出来

现在,不再需要这份痛苦了,minit 内置 WebDAV 服务,你可以像暴露一个标准服务一样暴露出来,省去了调度主机+映射主机目录等一堆烦心事

环境变量:

  • MINIT_WEBDAV_ROOT 指定要暴露的路径并启动 WebDAV 服务,比如 /srv
  • MINIT_WEBDAV_PORT 指定 WebDAV 服务的端口,默认为 7486
  • MINIT_WEBDAV_USERNAMEMINIT_WEBDAV_PASSWORD 指定 WebDAV 服务的用户密码,默认不设置用户密码

可以使用 Cyberduck 来连接 WebDAV 服务器 https://cyberduck.io/

展示自述文件

如果把一个文件放在 /etc/banner.minit.txt ,则 minit 在启动时会打印其内容

赞助

访问 https://guoyk.net/donation

许可证

GUO YANKE, MIT License

MIT License Copyright (c) 2022 GUO YANKE Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

一个用 Go 编写的进程管理工具,用以在容器内启动多个进程 展开 收起
Go 等 2 种语言
MIT
取消

发行版 (1)

全部

贡献者

全部

近期动态

加载更多
不能加载更多了
Go
1
https://gitee.com/acicn/minit.git
git@gitee.com:acicn/minit.git
acicn
minit
Minit
main

搜索帮助

14c37bed 8189591 565d56ea 8189591