Estoy creando una imagen a partir de un Dockerfile que necesita instalar el paquete rti-connext-dds-5.3.1 . (Es una de las dependencias al compilar ROS2 en Linux ).
El problema con ese paquete es que muestra un acuerdo de licencia que debe desplazarse hacia abajo y luego aceptarse ingresando "sí" en el mensaje. Parece que no puedo configurar los comandos de Dockerfile para desplazarse automáticamente y/o aceptar automáticamente este acuerdo de licencia:
Presionar la tecla Enter o Space no desplaza la licencia hacia abajo, solo muestra líneas en blanco. Presionar cualquier otra tecla/s simplemente lo imprime en la consola. En este punto, la compilación está atascada y no puede continuar.
Aquí está el 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 /homeYa probé:
DEBIAN_FRONTEND=noninteractive de diferentes maneras en función de las respuestas de ¿Es posible responder preguntas de diálogo al instalar en Docker?DEBIAN_FRONTEND=teletype basado en ¿Cómo aceptar el acuerdo de licencia durante la compilación de la ventana acoplable?debconf-set-selections basado en apt-get install sin indicador de debconf # 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 (esto es peor, ya que ni siquiera puedo abortar con 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¿Cómo desplazo y/o acepto automáticamente la licencia durante la instalación?
Puede usar la variable env "RTI_NC_LICENSE_ACCEPTED=yes". Su dockerfile se verá así:
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 /homeEsta es una respuesta válida, pero definitivamente no es la mejor. Actualmente estoy usando la versión de prueba de DDS que NO le permite aceptar automáticamente la licencia. Así que mi trabajo fue hacer lo siguiente:
Primero instalé el comando expect que le permite escribir scripts que interactuarán y decir presione enter 21 veces y luego la letra y , etc.
Además, hay un comando llamado autoexpect que generará un script para usted. Entonces mis pasos son:
Inicie un contenedor básico y copie sobre rti_connext_dds-6.0.1-eval-x64Linux4gcc7.3.0.run , o monte el archivo localmente
Ejecute autoexpect ./rti_connext_dds-6.0.1-eval-x64Linux4gcc7.3.0.run que generará script1.exp .
Ahora cree un contenedor real que copie el archivo de instalación, así como el script esperado y haga lo siguiente:
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 El mejor camino, por supuesto, es hacer lo que se sugirió anteriormente; sin embargo, para saber más sobre Docker expect es un gran truco.