docker と Cargo-deb を使用して、さまざまな Linux バージョンの .deb パッケージをパッケージ化する

問題の再現

私の Linux システムのバージョンは ubuntu 20.04 です。Rust プロジェクトを作成した後、cargo build --release を使用してパッケージ化し、deb パッケージを生成します (cargo-deb がインストールされていない場合、ビルドはバイナリ ファイルを生成します)。これは解凍してこのマシンに通常どおりインストールできますが、deb パッケージを友人に送ったのですが、解凍できませんでした。彼の Linux バージョンが ubuntu 16.04 であることがわかり、deb を解凍できませんでした20.04 でパッケージ化されたファイル。

解決策 1

docker を使用してイメージの 16.04 バージョンをプルし、docker の実行中に対応するフォルダーを docker コンテナーにマウントするパラメーターの使用に注意してください。その後、docker exec がコンテナーに入ってパッケージ化を完了し、パッケージ化された deb が 16.04 システム バージョンで正常に実行できるようにします-v

解決策 2

解決策 1 の root 権限を直接使用する方法は、実際には複数人での共同開発ではセキュリティ上のリスクがあります。最善の方法は、ホストと同じ名前のユーザーを Docker コンテナーに追加することです。ユーザーを追加するためのシェル スクリプトは次のとおりです。

# 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 中にイメージにコピーすることも、 host で使用することもできdocker cp [from_path] [to_path]、最後に docker run または docker exec 時にコマンドとパラメーターのリストを指定します。docker exec -it -u $username bash -c useradd.sh $username $userid $groupname $groupid

フォローアップ 报错「Rustlang「オーバーライドなし、デフォルトのツールチェーンセットなし」」

エラーの原因: 新しいユーザーを追加した後、Docker コンテナーに Rust 関連のユーザー設定がありません。解決策 1: 新しいユーザーを使用して Rust ツールチェーンを再インストールします。インストール方法はRust 公式 Web サイト
で確認できます。Rust の再インストールには時間がかかることに注意してください。プロキシが適切に設定されていないと、長時間インストールが成功しない可能性があります。

解決策 2: 他のユーザーの Rust 設定を使用します。Rust がインストールされた後、対応する設定がフォルダーに配置されます。つまり、別の~/.cargoユーザーが Rust とそのツール チェーンをインストールしている限り、コピーを現在のユーザー ディレクトリに直接コピーできます。コピー後、環境をアクティブ化し、コマンド ラインで「cargo -V」と入力してバージョンを表示しcp -r /home/${other_user}/.cargo /home/${curr_user}/ますsource ~/.cargo/envそれでもデフォルトのツールチェーン セットではなくオーバーライドが報告される場合は、 ~/.rustup フォルダーをコピーすることを検討してください。settings.tomlファイルは .rustup に保存され、Rust に関連する構成を表示できます。

解決策 3: ホスト関連のフォルダーを対応するコンテナー コンテナーに直接マウントし、-vパラメーターを使用します。この例では 2 つのフォルダーをマウントする必要があります~/.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的指令

おすすめ

転載: blog.csdn.net/Mint2yx4/article/details/125198895