使用docker build构建rti-connext-dds-5.3.1时如何接受许可协议?

时间:2019-05-12 14:31:59

标签: docker installation dockerfile apt-get data-distribution-service

我正在从Dockerfile构建映像,该映像需要安装软件包 rti-connext-dds-5.3.1 。 (这是building ROS2 on Linux时的依赖项之一)。

该软件包的问题在于,它显示了一个许可证协议,必须向下滚动该许可证协议,然后在提示上输入“ yes”以接受该协议。我似乎无法设置Dockerfile命令来自动滚动和/或自动接受此许可协议:

license agreement

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中可以看到,我已经尝试过:

在安装过程中如何自动滚动和/或自动接受许可证?

2 个答案:

答案 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 的命令可以为您生成脚本。所以我的步骤是:

  1. 启动一个基本容器并复制 rti_connext_dds-6.0.1-eval-x64Linux4gcc7.3.0.run - 或在本地挂载文件

  2. 运行 autoexpect ./rti_connext_dds-6.0.1-eval-x64Linux4gcc7.3.0.run 将生成 script1.exp

  3. 现在构建一个实际的容器,复制安装文件和 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 是一个很棒的小技巧