Skip to content

在没有安装docker的机器上部署docker镜像,打包成一个单独的可执行文件

Notifications You must be signed in to change notification settings

xinyang-go/portable-container

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Portable Container

一个轻量级的容器打包工具,用于部署的目标机器上没有安装docker时,将整个容器打包为一个单独的可执行文件。


使用方式:

./deploy-docker.sh EXE IMAGE APP [USER]

从docker镜像构建

./deploy-rootfs.sh EXE ROOTFS APP [USER]

从rootfs路径构建

./deploy-tar.sh EXE TAR APP [USER]

从tar文件构建

./deploy-sqfs.sh EXE SQFS APP [USER]

从squashfs文件构建

EXE: 生成的可执行文件名
APP: 容器内的入口程序
[USER]: 容器内程序执行时的用户(默认为root)

运行方式:

sudo ./app.run

使用 sudo运行生成的可执行文件即可。默认将会进入容器内并运行指定的入口程序。

运行时不需要安装docker。

不支持命令行传参。

sudo ./app.run --help

可以运行help查看支持的选项

目前支持的选项:

  • -b, --bind 将主机目录挂载到容器中
  • -d, --debug 进入容器并运行bash
  • -e, --env 设置容器的环境变量
  • -h, --help 显示帮助信息
  • -o, --overlay 指定overlay路径(如果不指定,则会使用tmpfs作为overlay)
  • -t, --tmpsz 指定tmpfs作为overlay的大小(默认128M)
  • -v, --verbose 打印脚本运行过程(通常用于调试脚本)

自定义挂载:

虽然可以通过命令行选项实现自定义挂载,但需要每次都手动输入挂载路径,对于一些固定的挂载项(如 /mnt目录下的外接硬盘等),会显得比较麻烦。

这时可以修改 template.sh文件(**TODO:**在 deploy-xx.sh中,通过命令行参数指定固定挂载)

例如希望将当前目录下的 config挂载到容器内的 /config,则加入这一行:

mount -o bind config $dir/rootfs/config

如果镜像内没有 /config目录,则需要首先创建该目录:

mkdir $dir/rootfs/config
mount -o bind config $dir/rootfs/config

自定义环境变量:

与自定义挂载类似,对于一些固定的环境变量,每次都用命令行参数设置环境变量会比较麻烦

可以采用修改 template.sh文件的方法(**TODO:**在 deploy-xx.sh中,通过命令行参数指定固定环境变量)

例如希望添加环境变量 ENV1=value1,则在 template.sh最后几行找到 /bin/env -i,在此处添加环境变量:(注意有两处需要修改)

chroot $dirws/rootfs /bin/env -i ENV1=value1 ...

限制:

  • 默认仅进行挂载点隔离与进程隔离。
  • 没有网络隔离,类似 --net=host
  • 没有进程间通信隔离,类似 --ipc=host
  • 没有用户隔离,容器内程序默认以root身份运行,或以容器内特定用户身份运行。
  • 不会自动加载容器内的环境变量(即Dockerfile里使用ENV定义的环境变量无效)。

原理:

将镜像内的文件系统制作成squashfs,并使用overlayfs在上面叠加一个tmpfs的可写层。

使用unshare实现挂载点隔离。

使用chroot实现文件系统隔离。

使用类似自解压程序的方式,将squashfs文件和运行脚本合并为一个可执行文件。

About

在没有安装docker的机器上部署docker镜像,打包成一个单独的可执行文件

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages