在Docker容器内静默安装pecl模块(例如pecl_http)?

3
我将尝试在Docker容器中安装pecl_http。目前,我的Dockerfile如下所示:
FROM fun:5000/apache-php:0.1.0

# Install dependencies
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && \
    apt-get -y install \
        php5-dev \
        libcurl4-openssl-dev && \

    yes "\n" | pecl install pecl_http-1.7.6 && \
    echo "extension=http.so" > /etc/php5/mods-available/http.ini && \
    cd /etc/php5/apache2/conf.d/ && \
    ln -s ../../mods-available/http.ini 20-http.ini && \
    ...

起初我在docker文件中只是使用pecl install pecl_http-1.7.6,容器成功构建了,但没有安装pecl_http。
如果我连接到容器,可以通过交互式的pecl install pecl_http-1.7.6来安装pecl_http,只需在每个提示后按回车即可。我刚刚了解到yes,它似乎符合我的需求。在线搜索表明很多人都用它来执行无人值守的pecl安装,包括pecl_http; 但是,当我尝试在我的docker容器中使用它时,它会失败并显示configure: error: could not find magic.h
如何在Docker中执行无声pecl_http安装?
1个回答

5

您的 pecl install 在询问以下问题:

是否启用响应内容类型猜测; 指定 libmagic 目录 [no]:

yes "\n" 并不能如您所想的那样工作 - 实际上它输出的是:

\n
\n
\n
\n
\n
\n

因为你在回答上面的问题时说了\n,所以安装程序认为你是告诉它去\n中查找libmagic,当然因为\n毫无意义,所以安装失败了。 yes在输出每个命令后都隐式返回,所以如果你想让它只是按下回车并使用默认设置,请使用yes ''
有效的Dockerfile
FROM ubuntu:14.04

# Install dependencies
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update
RUN apt-get -y install php5-dev
RUN apt-get -y install libcurl4-openssl-dev
RUN apt-get -y install libevent-dev
RUN echo "extension=http.so" > /etc/php5/mods-available/http.ini
RUN yes "" | pecl install pecl_http-1.7.6
RUN cd /etc/php5/apache2/conf.d/
RUN ln -s ../../mods-available/http.ini 20-http.ini
...

额外提示: 不要害怕将命令拆分成单独的RUN语句,以充分利用Docker缓存。


谢谢额外的小费!我一直在得到不同的反馈,关于如何拆分RUN命令。只要您经常安装相同的项目并按照相同的顺序安装它们,拆分它们是有好处的。我一直专注于特定的Dockerfile,因此将相关命令分组对我很有效。 - JoBu1324
我在stackoverflow上提出了一个关于拆分RUN语句的问题,如果您想要参与讨论,请留言。 - JoBu1324

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