使用 docker 构建 rti-connext-dds-5.3.1 时如何接受许可协议?
How to accept the license agreement when building rti-connext-dds-5.3.1 with docker build?
我正在从需要安装包 rti-connext-dds-5.3.1 的 Dockerfile 构建一个镜像。 (它是 building ROS2 on Linux 时的依赖项之一)。
该软件包的问题在于它显示了一个许可协议,必须向下滚动该协议,然后在提示中输入“是”接受该协议。我似乎无法将 Dockerfile 命令设置为自动滚动 and/or 自动接受此许可协议:
按 Enter 或 Space 键不会向下滚动许可证,它只会显示空行。按任何其他 key/s 只会将其打印到控制台。此时构建卡住了,无法进行。
这是 Dockerfile:
FROM ubuntu:bionic
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y apt-utils debconf-utils gnupg2 lsb-release && \
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 421C365BD9FF1F717815A3895523BAEEB01FA116 && \
echo "deb http://packages.ros.org/ros2/ubuntu `lsb_release -sc` main" > /etc/apt/sources.list.d/ros2-latest.list && \
apt-get update && \
apt-get install -y rti-connext-dds-5.3.1
WORKDIR /home
我已经试过了:
- 根据 Is it possible to answer dialog questions when installing under docker?
的答案设置 DEBIAN_FRONTEND=noninteractive
不同的方式
- 根据How to accept license agreement during docker build?
设置DEBIAN_FRONTEND=teletype
- 基于apt-get install without debconf prompt使用
debconf-set-selections
# echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && \
# echo "rti-connext-dds-5.3.1 rti-connext-dds-5.3.1/license string y" | debconf-set-selections && \
# echo "rti-connext-dds-5.3.1 rti-connext-dds-5.3.1/license string yes" | debconf-set-selections && \
- 管道
yes
命令(这更糟,因为我什至不能用 Ctrl+C 中止)
# apt-get install -y -q rti-connext-dds-5.3.1
# yes "yes" | apt-get install -y -q rti-connext-dds-5.3.1
如何在安装过程中自动滚动 and/or 自动接受许可?
您可以使用环境变量"RTI_NC_LICENSE_ACCEPTED=yes"。您的 dockerfile 将如下所示:
FROM ubuntu:bionic
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y apt-utils debconf-utils gnupg2 lsb-release && \
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 421C365BD9FF1F717815A3895523BAEEB01FA116 && \
echo "deb http://packages.ros.org/ros2/ubuntu `lsb_release -sc` main" > /etc/apt/sources.list.d/ros2-latest.list && \
apt-get update
RUN RTI_NC_LICENSE_ACCEPTED=yes apt-get install rti-connext-dds-5.3.1
WORKDIR /home
这是一个有效的答案,但肯定不是最好的答案。我目前正在使用 DDS 的试用版,它不允许您自动接受许可证。所以我的解决方法是执行以下操作:
首先,我安装了 expect
命令,它允许您编写可以交互的脚本,并说出点击 enter
21 次,然后输入字母 y
等
此外,还有一个名为 autoexpect
的命令会为您生成一个脚本。所以我的步骤是:
启动基本容器并复制 rti_connext_dds-6.0.1-eval-x64Linux4gcc7.3.0.run
- 或在本地安装文件
运行 autoexpect ./rti_connext_dds-6.0.1-eval-x64Linux4gcc7.3.0.run
将生成 script1.exp
.
现在构建一个复制安装文件和 expect 脚本的实际容器,并执行以下操作:
ARG RTI_INSTALL_FILE=rti_connext_dds-6.0.1-eval-x64Linux4gcc7.3.0.run
RUN chmod +x /rti/${RTI_INSTALL_FILE} && expect /rti/script.exp
最好的方法 - 当然 - 是按照上面的建议去做 - 然而 - 了解更多关于 docker expect
是一个很棒的小技巧
我正在从需要安装包 rti-connext-dds-5.3.1 的 Dockerfile 构建一个镜像。 (它是 building ROS2 on Linux 时的依赖项之一)。
该软件包的问题在于它显示了一个许可协议,必须向下滚动该协议,然后在提示中输入“是”接受该协议。我似乎无法将 Dockerfile 命令设置为自动滚动 and/or 自动接受此许可协议:
按 Enter 或 Space 键不会向下滚动许可证,它只会显示空行。按任何其他 key/s 只会将其打印到控制台。此时构建卡住了,无法进行。
这是 Dockerfile:
FROM ubuntu:bionic
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y apt-utils debconf-utils gnupg2 lsb-release && \
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 421C365BD9FF1F717815A3895523BAEEB01FA116 && \
echo "deb http://packages.ros.org/ros2/ubuntu `lsb_release -sc` main" > /etc/apt/sources.list.d/ros2-latest.list && \
apt-get update && \
apt-get install -y rti-connext-dds-5.3.1
WORKDIR /home
我已经试过了:
- 根据 Is it possible to answer dialog questions when installing under docker? 的答案设置
- 根据How to accept license agreement during docker build? 设置
- 基于apt-get install without debconf prompt使用
debconf-set-selections
# echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && \ # echo "rti-connext-dds-5.3.1 rti-connext-dds-5.3.1/license string y" | debconf-set-selections && \ # echo "rti-connext-dds-5.3.1 rti-connext-dds-5.3.1/license string yes" | debconf-set-selections && \
- 管道
yes
命令(这更糟,因为我什至不能用 Ctrl+C 中止)# apt-get install -y -q rti-connext-dds-5.3.1 # yes "yes" | apt-get install -y -q rti-connext-dds-5.3.1
DEBIAN_FRONTEND=noninteractive
不同的方式
DEBIAN_FRONTEND=teletype
如何在安装过程中自动滚动 and/or 自动接受许可?
您可以使用环境变量"RTI_NC_LICENSE_ACCEPTED=yes"。您的 dockerfile 将如下所示:
FROM ubuntu:bionic
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y apt-utils debconf-utils gnupg2 lsb-release && \
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 421C365BD9FF1F717815A3895523BAEEB01FA116 && \
echo "deb http://packages.ros.org/ros2/ubuntu `lsb_release -sc` main" > /etc/apt/sources.list.d/ros2-latest.list && \
apt-get update
RUN RTI_NC_LICENSE_ACCEPTED=yes apt-get install rti-connext-dds-5.3.1
WORKDIR /home
这是一个有效的答案,但肯定不是最好的答案。我目前正在使用 DDS 的试用版,它不允许您自动接受许可证。所以我的解决方法是执行以下操作:
首先,我安装了 expect
命令,它允许您编写可以交互的脚本,并说出点击 enter
21 次,然后输入字母 y
等
此外,还有一个名为 autoexpect
的命令会为您生成一个脚本。所以我的步骤是:
启动基本容器并复制
rti_connext_dds-6.0.1-eval-x64Linux4gcc7.3.0.run
- 或在本地安装文件运行
autoexpect ./rti_connext_dds-6.0.1-eval-x64Linux4gcc7.3.0.run
将生成script1.exp
.现在构建一个复制安装文件和 expect 脚本的实际容器,并执行以下操作:
ARG RTI_INSTALL_FILE=rti_connext_dds-6.0.1-eval-x64Linux4gcc7.3.0.run
RUN chmod +x /rti/${RTI_INSTALL_FILE} && expect /rti/script.exp
最好的方法 - 当然 - 是按照上面的建议去做 - 然而 - 了解更多关于 docker expect
是一个很棒的小技巧