安装Docker中的PHP扩展ssh2

4

我正在使用官方的PHP Docker镜像作为我的应用程序容器的基础,因此Dockerfile的开头如下:

FROM php:5.6-fpm-jessie

文件后面我希望有类似这样的内容:

 RUN apt-get update \
    && apt-get install -y libssh2-1-dev libssh2-1 \
    && docker-php-ext-install ssh2

但这告诉我:
/usr/src/php/ext/ssh2 does not exist

因为这是一个基于Debian (yessie)的镜像,只有旧版的php5包可用,而php7是通过一些巧妙的脚本在php:fpm dockerfile中安装的,并且似乎所有扩展都是在使用的php可执行文件内编译的。

在这种情况下,我该如何安装更多的扩展?


我认为你需要将php-ssh2添加到你的apt-get安装中? - Chris Cousins
抱歉,我忘记将 ssh2 复制到该行中。 - code.g
也许可以进入容器并检查php/ext所在的路径是否正确? - Chris Cousins
我猜docker-php-ext-install是否包含ssh2扩展?但我不知道如何检查。 - code.g
难道不应该是docker-php-ext-install php-ssh2吗? - Chris Cousins
谢谢,我使用 pecl install,并且成功了。 - code.g
10个回答

9

如果您使用的是 PHP >=8.0 版本,图像相关的:

FROM php:8.0.2-fpm

RUN apt-get install -y libssh2-1-dev libssh2-1 \
    && pecl install ssh2-1.3.1 \
    && docker-php-ext-enable ssh2

似乎在PHP8以下版本中ssh2无法工作,安装ssh2-1.3.1可解决问题! - jsdecena
我不知道为什么,但是无论出于什么原因,pecl install ssh2 将安装 ssh2-1.2 而不是最新版本。手动指定 1.3.1 就解决了问题。 - Steen Schütt

7

针对Alpine操作系统和PHP > 7版本

RUN apk add --no-cache libssh2-dev autoconf build-base
RUN pecl install ssh2-1.2 && docker-php-ext-enable ssh2

1
在CLI镜像php:7.2-cli上对我有用。通过apt-get install -y libssh2-1 libssh2-1-dev安装库,而不是apk add libssh2-dev。感谢您提供的解决方案! - Sergii Shymko
更具体地说,版本1.2(和1.3)适用于PHP 7.x。它将无法在PHP 8及以上版本中运行。 - Steen Schütt

5

最终,这是成功的。

&& apt-get install -y libssh2-1-dev libssh2-1 \
&& pecl install ssh2 \
&& docker-php-ext-enable ssh2 

另外,始终记得在此后清理你的镜像:RUN apt-get clean && apt-get autoremove -y && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/src - Mike Doe
嗯?我在想,我应该把 RUN apt-get clean ... 放在我的 Dockerfile 的末尾吗? - code.g
2
pecl/ssh2需要PHP(版本>= 4.0.0,版本<= 6.0.0),已安装的版本为7.1.27。有关PHP> 6的任何建议? - lightswitch05
这仅适用于 PHP 7.0 及以下版本,因此 5.x.x 版本及以上将无法使用。 - marcogmonteiro
以下指令可行:RUN apt-get install -y libssh2-1 libssh2-1-dev RUN pecl install ssh2-1.2 docker-php-ext-enable ssh2已在 Docker Composer 3 和 PHP 7.4.15 上测试通过。 - Asrar

4

看起来pecl选项对于PHP 6之后的任何版本都不可用。为了安装它,我必须从源代码构建。使用这些命令,我能够从 php:7.1.27-cli 中安装它 - php:7.1.27-cli 镜像基于debian stretch:

# install dependencies 
RUN apt-get update && apt-get install -y \
    ssh \
    libssh2-1 \
    libssh2-1-dev \
    wget \
    libssl-dev \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Install ssh2 extension
RUN wget -O libssh2.tar.gz https://www.libssh2.org/download/libssh2-1.8.1.tar.gz \
    && wget -O ssh2.tgz https://pecl.php.net/get/ssh2-1.1.2.tgz \
    && mkdir libssh2 && tar vxzf libssh2.tar.gz -C libssh2 --strip-components 1 \
    && mkdir ssh2 && tar vxzf ssh2.tgz -C ssh2 --strip-components 1 \
    && cd libssh2 && ./configure \
    && make && make install \
    && cd ../ssh2 && phpize && ./configure --with-ssh2 \
    && make && make install \
    && echo "extension=ssh2.so" >> /usr/local/etc/php/conf.d/ssh2.ini \
    && cd ../ && rm -rf libssh2.tar.gz ssh2.tgz ssh2 libssh2

1
有比PHP6更新的版本吗?那个版本是什么时候发布的?:P - ggdx
这正是我想要的。非常感谢你。 - marcogmonteiro

2
最简单的解决方案是使用install-php-extensions。 这是一个脚本,可以在任何Docker PHP镜像上自动安装所需的系统库。
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/

RUN install-php-extensions ssh2

install-php-extensions可以安装许多其他PHP扩展,而不仅仅是ssh2:更多详情请参见https://github.com/mlocati/docker-php-extension-installer


嗨,Michele!我尝试了你的解决方案,但是在完成后重新启动容器、附加 shell 并输入 php --ri ssh2 后,我收到了 Extension 'ssh2' not present. 的提示。所以如果我尝试使用 ssh2_connect() 这样的函数,我将会收到类似于 Call to undefined function ssh2_connect() 的错误提示。 - Luis Martin
这对我有用。我不明白的是为什么扩展安装程序可以工作,但手动添加libssh2却不能。使用libssh4是一个可行的解决方案,但是ssh2却无法识别。我正在使用php:8.0-fpm。 - Maarten
这对我有用。我不明白的是为什么扩展安装程序可以工作,但手动添加libssh2却不行。使用libssh4是可以的,但是ssh2却无法识别。我正在使用php:8.0-fpm - undefined

1

对于我来说,在PHP 7.2的CLI镜像上起作用的解决方案如下:

FROM php:7.2-cli

RUN apt-get install -y libssh2-1 libssh2-1-dev
RUN pecl install ssh2-1.2 && docker-php-ext-enable ssh2

构建Docker镜像并确认安装了SSH2扩展:
docker build -t example/php-build .
docker run --rm example/php-build php --ri ssh2

ssh2

SSH2 support => enabled
extension version => 1.2
libssh2 version => 1.8.0
banner => SSH-2.0-libssh2_1.8.0

你是怎么得到的?我遇到了这个错误: #0 26.07 pecl/ssh2 需要 PHP(版本 >= 4.0.0,版本 <= 6.0.0),已安装的版本为 7.4.33 - Luis Martin

0

我在其他解决方案上遇到了一些错误,在richarvey/nginx-php-fpm镜像的运行容器中使用了两个命令。

apk add --no-cache libssh2-dev autoconf build-base
pecl install https://pecl.php.net/get/ssh2-1.3.tgz
docker-php-ext-enable ssh2

0

使用PHP 7.4的工作解决方案:

FROM php:7.4-fpm
RUN apt-get install -y libssh2-1 libssh2-1-dev
RUN pecl install ssh2-1.2 && docker-php-ext-enable ssh2

0

对于正在寻找 PHP 7.4 较新版本的人,您需要以下内容:

安装依赖项

RUN apt-get update && apt-get install -y \
    ssh \
    libssh2-1 \
    libssh2-1-dev \
    wget \
    libssl-dev \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Install ssh2 extension

RUN wget -O libssh2.tar.gz https://www.libssh2.org/download/libssh2-1.9.0.tar.gz \
    && wget -O ssh2.tgz https://pecl.php.net/get/ssh2-1.2.tgz \
    && mkdir libssh2 && tar vxzf libssh2.tar.gz -C libssh2 --strip-components 1 \
    && mkdir ssh2 && tar vxzf ssh2.tgz -C ssh2 --strip-components 1 \
    && cd libssh2 && ./configure \
    && make && make install \
    && cd ../ssh2 && phpize && ./configure --with-ssh2 \
    && make && make install \
    && echo "extension=ssh2.so" >> /usr/local/etc/php/conf.d/ssh2.ini \
    && cd ../ && rm -rf libssh2.tar.gz ssh2.tgz ssh2 libssh2

这里发布的链接只能在php 7.2及以下版本中使用。


0
我已经为Laravel Sail添加了以下内容:
php8.2-ssh2 \

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