2014-09-19 74 views
2

我正在尝试在docker容器中安装pecl_http。目前我Dockerfile看起来是这样的:在泊坞窗文件默默安装pecl模块(例如pecl_http)在Docker容器中?

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 && \ 
    ... 

起初,我只是用pecl install pecl_http-1.7.6,和容器成功地建造 - 没有安装pecl_http。

如果我附加到容器,我可以安装pecl_http与交互式pecl install pecl_http-1.7.6只需按每个提示后输入。我刚刚了解到yes,它似乎符合我的需求。在线搜索表明,很多人都用它来执行无人值守的pecl安装,包括pecl_http;但是,当我尝试在我的泊坞窗容器中使用它时,它会失败,并显示configure: error: could not find magic.h

如何在Docker中执行silent pecl_http安装?

回答

2

pecl install问你这样一个问题:

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

而且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语句来充分利用泊坞窗缓存。

+0

感谢您的额外提示!我已经得到了关于如何拆分RUN命令的不同反馈。只要您按照相同的顺序安装相同的物品,将它们拆分即可。我一直专注于特定的Docker文件,因此将相关的命令组合在一起对我来说效果很好。 – JoBu1324 2014-09-19 22:15:08

+0

我打开了一个关于拆分RUN语句的[question](http://stackoverflow.com/q/25943274/118234),如果你想称重 – JoBu1324 2014-09-19 22:34:16