利用docker和cargo-deb打包适用于不同linux版本的.deb包

问题重现

我的Linux系统版本是ubuntu 20.04,当写完一个rust项目使用cargo build --release打包生成deb包(如果没有安装cargo-deb的话build出来的是二进制文件),在本机上能正常解压安装,但是把deb包发给朋友,他却无法解压,发现是他的linux版本是ubuntu 16.04,无法解压在20.04下打包的deb文件

解决方案1

使用docker pull一个16.04版本的image,同时在docker run的时候注意使用 -v 参数挂载对应的文件夹到docker container中,随后docker exec 进入container完成打包,这样打包出来的deb就可以正常运行在16.04的系统版本中

解决方案2

方案1直接使用root权限其实在多人协作开发中是存在安全隐患的,最好的方法是在docker container中新增一个跟host同名的用户,新增用户的shell脚本大致如下

# useradd.sh
#! /bin/bash
USER_NAME=$1
USER_ID=$2
GRP_NAME=$3
GRP_ID=$4

# check if the group name exits, if not , add it
getent group | grep "${USER_NAME}:x" > /dev/null 2>&1 || addgroup  --quiet --gid "$GRP_ID" "$GRP_NAME"
# add user to the group
adduser  --quiet --disabled-password --force-badname --gecos '' "$USER_NAME" \
    --uid "$USER_ID" --gid "$GRP_ID" 2>/dev/null
# give user the sudo privilege
usermod -aG sudo "$USER_NAME"
sudo echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
# copy user setup
cat /etc/skel/.bashrc >> "/home/${USER_NAME}/.bashrc"


# Set user files ownership to current user, such as .bashrc, .profile, etc.
sudo chown -R "${USER_NAME}:${GRP_NAME}" "/home/${USER_NAME}"
source "/home/${USER_NAME}/.bashrc"

这里的useradd.sh可以在docker build的时候通过copy到镜像中,也可以在host中使用docker cp [from_path] [to_path] ,最后在docker run 或者 docker exec 的时候指定命令和参数列表,比如 docker exec -it -u $username bash -c useradd.sh $username $userid $groupname $groupid

Follow up 报错“Rustlang “no override and no default toolchain set””

错误原因:新增用户之后在docker container中并没有rust相关的用户配置
解决方案1: 使用新增用户重新安装一遍rust工具链,可以在rust官网找到安装办法,注意,重新安装rust比较耗时,如果代理设置不当可能很久都无法安装成功。

解决方案2: 利用已有其他用户的rust配置,rust安装后对应的配置都放在~/.cargo文件夹中,也就是说,只要另一个用户已经安装了rust及其工具链,我们可以直接copy一份到当前用户目录下cp -r /home/${other_user}/.cargo /home/${curr_user}/,copy完之后source ~/.cargo/env激活环境,可以在命令行输入cargo -V查看版本。如果还是报override and not default toolchain set的话,考虑将~/.rustup文件夹也copy过来,.rustup里存放了settings.toml文件,可以查看到与rust有关的配置。

解决方案3: 直接将host相关文件夹挂载到对应的container容器中,使用-v参数,在本例中需要挂载~/.cargo~/.rustup两个文件夹,对应docker指令如下

docker run -itd \ # 运行docker
		--name test_rust \ # 设置container名称
		-v ${HOME}/.cargo:/home/${USER_NAME}/.cargo \ # 将host的.cargo文件夹挂载到container中$USER_NAME对应配置文件夹下
		-v ${HOME}/.rustup:/home/${USER_NAME}/.cargo \ # 将host的.rustup文件夹挂载到container中$USER_NAME对应配置文件夹下
		${DOCKER_IMAGE} \ # 指定${DOCKER_IMAGE}镜像来创建container
		/bin/bash > /dev/null # 运行container的指令
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值