1. 程式人生 > >docker+lnmp 報錯小結,以laradock為例,其它同理

docker+lnmp 報錯小結,以laradock為例,其它同理

用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的相關資源時,就遇到了問題,拿本子回家再拉時,一點報錯都沒~~?)