回答“29”以在apt-get安装xorg时取消提示

5
我正在使用Docker组合脚本,当xorg包询问键盘原产地的国家时,它会卡住并提示。我将附上图片。 我尝试了从其他答案中阅读的这样的命令管道。
RUN echo "29" | apt-get install -y xorg

但似乎没有起作用。我不确定如何让它自动回答29。欢迎任何帮助。

enter image description here

enter image description here

参考 Docker 文件

FROM ubuntu:16.04
MAINTAINER Joe Astrahan <email@hey.com>

VOLUME ["/var/www"]

#Install Apache & Basic Software
RUN apt-get update && \
    apt-get install -y \
      software-properties-common \
      apache2 \
      curl \
      libcurl3 \
      libcurl3-dev

#Install PHP 7.0 & mod apache
RUN apt-get install -y \
      php7.0 \
      php7.0-cli \
      libapache2-mod-php7.0 \
      php7.0-gd \
      php7.0-json \
      php7.0-ldap \
      php7.0-mysqlnd \
      php7.0-pgsql \
      php7.0-curl \
      php7.0-xml \
      php7.0-xsl \
      php7.0-zip \
      php7.0-sqlite3 \
      php7.0-ldap \
      php7.0-json \
      php7.0-mbstring \
      php7.0-soap \
      php7.0-intl \
      php7.0-bcmath \
      php7.0-gmp \
      php7.0-mcrypt


#Install mysql, vim and openssl
RUN apt-get install -y \
      mysql-client \
      vim \
      openssl

# Copy an initial PHP.ini file into the system with default settings
#COPY config/php.ini /etc/php5/apache2/php.ini

# Install php-5.5.30
#ADD config/install_php-5.5.30.sh /tmp/install_php-5.5.30.sh
#RUN /bin/bash /tmp/install_php-5.5.30.sh

# Set environment variables for Apache so we know its user and group names
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data

# Configure Apache SSL and Standard Virtualhosts
COPY config/apache_default.conf /etc/apache2/sites-available/000-default.conf
COPY config/apache_default-ssl.conf /etc/apache2/sites-available/default-ssl.conf
COPY config/run /usr/local/bin/run

# Configure SSL Directories & Create Temporary SSL Keys
RUN mkdir /etc/apache2/ssl
RUN openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt  -subj "/C=US/ST=Florida/L=Fort Lauderdale/O=Pool Service Software LLC/OU=IT Department/CN=dev.poolservice.software.local"

RUN chmod +x /usr/local/bin/run
RUN a2enmod rewrite

#Configure SSL On Apache2 & Headers Mod
RUN a2enmod ssl
RUN a2enmod headers
RUN service apache2 restart
RUN a2ensite default-ssl.conf
RUN service apache2 restart

#RUN apt-get install -y wkhtmltopdf

#Download and install composer and git
RUN apt-get install git -y
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

#Install Zip & Unzip
RUN apt-get install zip unzip -y

#Install NodeJS
#RUN curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
RUN apt-get install -y nodejs
RUN apt-get install -y npm

#Install UglifyCSS and JS
RUN npm install -g uglify-js
RUN npm install -g uglifycss
RUN npm install -g less

# Download and install wkhtmltopdf 
RUN apt-get install -y build-essential 
RUN echo "29" | apt-get install -y xorg
RUN apt-get install -y libssl-dev
RUN apt-get install -y libxrender-dev
RUN apt-get install -y wget
RUN apt-get install -y gdebi
RUN apt-get install -y libxrender1
RUN apt-get install -y xfonts-utils
RUN apt-get install -y xfonts-base
RUN apt-get install -y xfonts-75dpi
RUN apt-get install -y libfontenc1
RUN apt-get install -y x11-common
RUN apt-get install -y xfonts-encodings
RUN apt-get install -y libxfont1
RUN apt-get install -y fontconfig
RUN wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-trusty-amd64.deb
RUN gdebi --n wkhtmltox-0.12.2.1_linux-trusty-amd64.deb
RUN echo 'exec xvfb-run -a -s "-screen 0 640x480x16" wkhtmltopdf "$@"' | tee /usr/local/bin/wkhtmltopdf.sh >/dev/null && sudo chmod a+x /usr/local/bin/wkhtmltopdf.sh

EXPOSE 80
EXPOSE 443

CMD ["/usr/local/bin/run"]

你有这些信息的文本吗?我没有耐心把所有内容都打出来给你一个好的答案。 - BMitch
是的,如果需要,我可以提供文本。不过你需要哪些文本呢?目前我已经添加了Dockerfile,这基本上就是我的做法。 - Joseph Astrahan
基本上关键是这个,运行 echo "29" | apt-get install -y xorg,所以这就是你在 Ubuntu 16 上的 Docker 中需要输入的全部内容。 - Joseph Astrahan
Dockerfile 是我需要的部分,但实际上任何文本都应该作为文本包含在内,而不是作为图片,以便让其他遇到类似问题的人可以搜索到这个问题。 - BMitch
你可以通过环境变量告诉apt-get如何处理这些情况--根本没有必要模拟用户输入;这样做是脆弱的(不是文档化接口的一部分;随着未来的变化可能会出现问题),并且违反最佳实践。 - Charles Duffy
进一步解释“脆弱”——因为接口的构建是基于假设会有人阅读屏幕并作出响应,所以构建这些包的人通常可以在版本之间更改数字/排序等。相比之下,如果有一个环境变量或其他编程接口旨在供脚本使用,那么只有在它不以悄无声息的不兼容方式发生变化时,这样的接口才能最大限度地发挥作用,因此更容易信任其随时间保持稳健。 - Charles Duffy
1个回答

13

我看到提供的Dockerfile存在一些问题。

  1. 在Dockerfile中定义卷提供了很少或者没有价值。最好在docker-compose.yml中定义或者作为运行命令的一部分定义。我写了一篇博客文章来讲解这些问题。

  2. apt-get update和后面的apt-get install命令拆分开可能会导致apt-get install失败。关于这个问题,有一个章节在最佳实践文档中有说明。

  3. 对于您的错误消息,我建议以非交互方式运行apt-get。如果需要在安装期间设置非默认值,则可以进行预配置debconf

  4. 将每个apt-get分成单独的RUN命令会创建大量多余的层,应尽可能合并这些命令。这也在最佳实践文档中说明。

以下是一个考虑到上述问题的安装命令示例:

FROM ubuntu:16.04

RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y \
      build-essential \
      xorg \
      libssl-dev \
      libxrender-dev \
      wget \
      gdebi \
      libxrender1 \
      xfonts-utils \
      xfonts-base \
      xfonts-75dpi

2
还要寻找“Debian无人值守安装”。例如,https://wiki.debian.org/DebianInstaller/Preseed - Seth Difley
我之所以分割它,是为了找出哪个软件包引起了问题,谢谢你,我现在要尝试一下。 - Joseph Astrahan
好的,问题已经解决了,谢谢!我也按照您的建议进行了更新和安装。 - Joseph Astrahan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接