我正在从Dockerfile构建映像,该映像需要安装软件包 rti-connext-dds-5.3.1 。 (这是building ROS2 on Linux时的依赖项之一)。
该软件包的问题在于,它显示了一个许可证协议,必须向下滚动该许可证协议,然后在提示上输入“ yes”以接受该协议。我似乎无法设置Dockerfile命令来自动滚动和/或自动接受此许可协议:
按 Enter 或 Space 键不会向下滚动许可证,它只会显示空白行。按下任何其他键只会将其打印到控制台。至此,构建卡住了,无法继续进行。
这是Dockerfile:
FROM ubuntu:bionic
ARG DEBIAN_FRONTEND=noninteractive
# ARG DEBIAN_FRONTEND=teletype
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 && \
# 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 && \
apt-get install -y rti-connext-dds-5.3.1
# apt-get install -y -q rti-connext-dds-5.3.1
# yes "yes" | apt-get install -y -q rti-connext-dds-5.3.1
WORKDIR /home
从Dockerfile中可以看到,我已经尝试过:
DEBIAN_FRONTEND=noninteractive
不同的方式DEBIAN_FRONTEND=teletype
debconf-set-selections
yes
命令(这更糟,因为我什至无法使用 Ctrl + C 中止)在安装过程中如何自动滚动和/或自动接受许可证?
答案 0 :(得分:3)
您可以使用环境变量“ RTI_NC_LICENSE_ACCEPTED =是”。您的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
答案 1 :(得分:1)
这是一个有效的答案,但绝对不是最好的答案。我目前正在使用 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
是一个很棒的小技巧