docker+lnmp 报错小结,以laradock为例,其它同理

            • 1、安装PHP扩展失败
            • 2、安装YARN时失败
            • 3、php-fpm的镜像源问题
            • 最后,提醒

用vagrant + centos7 + lnmp开发都快两年,这是一个很好用的本地开发环境。对于我来说,它更像是一台真正的linux电脑,能真正直接把握它的每一处地方。而且现在内存都普遍8G以上的本子,加上SSD真的是毫无压力。

但时间一长,暴露出很多很烦人的东西:
(1)只对本地有用,到了线上环境又是一堆恶心的依赖报错。当然也可以写install.sh,但维护起来又麻烦。
(2)协作开发时,大家的盒子不可能一直同步,总有一些依赖是你所没有的。交流总是会有成本的。
(3)持续集成时(我用的是gitlab),流水线似乎更喜欢docker
……

看来,是时候归纳一波docker的坑了。下面的报错,我查github的issues和stackoverflow的比较多,感觉国内的文档还是少(更多的文档是官方文档的英文翻译)。

对于docker-compose的LNMP环境,自己写的总不如人家一直维护的好,网上也有很多dnmp之类的。最后比较了一上,还是用了laradock, https://github.com/laradock/laradock

另外,我自己fork了一份代码,用来跟踪官方代码变化。地址如下:https://github.com/tianrang/laradock.git。我创建了 fork 分支,我自己的lnmp环境就是在这个 fork 分支下创建的,实在搞不定laradock的可以去看看我的fork分支的提交修改记录(就改了几处~)。

还有,如果在安装过程中出现 443 端口的问题,比如安装 node 的时候可能会出现,那么就请换一个WIFI。各种办公环境不一样,路由器设置不一样,网络也是五花八门。你也可以用手机热点来解决这个问题,并且真心费不了什么流量。请别吝啬你的4G。真正在云服务器上部署时是不会遇到这样的问题的。

1、安装PHP扩展失败

下面的报错以 php-redis安装失败为例

Step 15/62 : RUN if [ ${INSTALL_PHPREDIS} = true ]; then     printf "\n" | pecl install -o -f redis     &&  rm -rf /tmp/pear     &&  docker-php-ext-enable redis ;fi
 ---> Running in 2a40c1b57944
No releases available for package "pecl.php.net/redis"
install failed
ERROR: Service 'php-fpm' failed to build: The command '/bin/sh -c if [ ${INSTALL_PHPREDIS} = true ]; then     printf "\n" | pecl install -o -f redis     &&  rm -rf /tmp/pear     &&  docker-php-ext-enable redis ;fi' returned a non-zero code: 1

原因:其实,就一句话 No releases available for package "pecl.php.net/redis",社区有人说是因为 pecl.php.net的https的原因。

解决:
(1)http_proxy代理。在所有需要安装PHP扩展的 Dockerfile 文件(如 ./php-fpm/Dockerfile)内添加如下配置

RUN pear config-set http_proxy "代理IP"

加的位置看自己吧,只要加到安装扩展代码的前边就可以。

(2)如果以上的问题都失败了,那么就只能编译安装PHP扩展了。至于具体的代码的话,参考 laradock 的 memcached 的安装方法,剩下的就是复制粘贴的活了。

最后,强烈建议手动改写,通过编译方式安装扩展(我搞了一个月,也就这种方法最简单)。可以去官方GITHUB上FORK一份代码,再新建立一个fork分支,在这个分支上修改就可以。下面附上我的XDEBUG的安装代码,如果要安装其它扩展,把下面的XDEBUG替换就好了。另外,一定不要在pecl.php.net上找下载地址,最好去github上找。

RUN if [ ${INSTALL_XDEBUG} = true ]; then \
  # Install the xdebug extension
  if [ $(php -r "echo PHP_MAJOR_VERSION;") = "5" ]; then \
    curl -L -o /tmp/xdebug.tar.gz "https://github.com/xdebug/xdebug/archive/XDEBUG_2_5_5.tar.gz"; \
  else \
    curl -L -o /tmp/xdebug.tar.gz "https://github.com/xdebug/xdebug/archive/2.6.1.tar.gz"; \
  fi && \
  mkdir -p xdebug \
    && tar -C xdebug -zxvf /tmp/xdebug.tar.gz --strip 1 \
    && ( \
        cd xdebug \
        && phpize \
        && ./configure \
        && make -j$(nproc) \
        && make install \
    ) \
    && rm -r xdebug \
    && rm /tmp/xdebug.tar.gz \
    && docker-php-ext-enable xdebug \
;fi
2、安装YARN时失败

报错:

GPG signature for this Yarn release is invalid! This is BAD and may mean the release has been tampered with. It is strongly recommended that you report this to the Yarn developers.
ERROR: Service 'workspace' failed to build: The command '/bin/sh -c if [ ${INSTALL_YARN} = true ]; then     [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" &&     if [ ${YARN_VERSION} = "latest" ]; then         curl -o- -L https://yarnpkg.com/install.sh | bash;     else         curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version ${YARN_VERSION};     fi &&     echo "" >> ~/.bashrc &&     echo 'export PATH="$HOME/.yarn/bin:$PATH"' >> ~/.bashrc ;fi' returned a non-zero code: 1

解决:将 .env 中的 WORKSPACE_TIMEZONE=UTC 修改为 WORKSPACE_TIMEZONE=PRC。然后多试几次,因为有可能网络出现问题。

3、php-fpm的镜像源问题

错误:

W: Size of file /var/lib/apt/lists/security.debian.org_dists_jessie_updates_main_binary-amd64_Packages.gz is not what the server reported 390976 644193
W: Size of file /var/lib/apt/lists/deb.debian.org_debian_dists_jessie_main_binary-amd64_Packages.gz is not what the server reported 9035431 9064025
W: Failed to fetch http://security.debian.org/dists/jessie/updates/main/binary-amd64/Packages  Hash Sum mismatch

W: Failed to fetch http://deb.debian.org/debian/dists/jessie/main/binary-amd64/Packages  Hash Sum mismatch

E: Some index files failed to download. They have been ignored, or old ones used instead.
ERROR: Service 'php-fpm' failed to build: The command '/bin/sh -c apt-get update -yqq &&     apt-get install -y apt-utils &&     pecl channel-update pecl.php.net' returned a non-zero code: 100

解决:
替换阿里云镜像源
(1)首先,在./php-fpm目录下建立 sources.list.aliyun 文件,里面写入阿里云源内容,如下

deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

(2)在./php-fpm/Dockerfile 里,在RUN apt-get update -yqq 上一行加入替换动作,如下

COPY ./sources.list.aliyun /etc/apt/sources.list
RUN rm -rf /var/lib/apt/lists/* && \
    apt-get clean && \
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 && \
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
最后,提醒

其实安装的过程中,大部分不属于docker的问题,而是属于ubuntu系统的方面问题(当然PECL的问题也十分恶心)。我习惯了centos,却不太了解ubuntu的一些坑。如果大家遇到类似源的问题或源资源拉取问题时,不防换个网络,再继续拉取。(我们公司网络下下载nginx的相关资源时,就遇到了问题,拿本子回家再拉时,一点报错都没~~?)

你可能感兴趣的:(报错)