Docker 安装 PHP

  FROM debian:jessie

  # persistent / runtime deps

  ENV PHPIZE_DEPS

  autoconf

  file

  g++

  gcc

  libc-dev

  make

  pkg-config

  re2c

  RUN apt-get update && apt-get install -y

  $PHPIZE_DEPS

  ca-certificates

  curl

  libedit2

  libsqlite3-0

  libxml2

  --no-install-recommends && rm -r /var/lib/apt/lists/*

  ENV PHP_INI_DIR /usr/local/etc/php

  RUN mkdir -p $PHP_INI_DIR/conf.d

  ####

  ENV PHP_EXTRA_CONFIGURE_ARGS --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data

  ####

  ENV GPG_KEYS 0BD78B5F97500D450838F95DFE857D9A90D90EC1 6E4F6AB321FDC07F2C332E3AC2BF0BC433CFC8B3

  ENV PHP_VERSION 5.6.22

  ENV PHP_FILENAME php-5.6.22.tar.xz

  ENV PHP_SHA256 c96980d7de1d66c821a4ee5809df0076f925b2fe0b8c362d234d92f2f0a178e2

  RUN set -xe

  && buildDeps="

  $PHP_EXTRA_BUILD_DEPS

  libcurl4-openssl-dev

  libedit-dev

  libsqlite3-dev

  libssl-dev

  libxml2-dev

  xz-utils

  "

  && apt-get update && apt-get install -y $buildDeps --no-install-recommends && rm -rf /var/lib/apt/lists/*

  && curl -fSL "http://php.net/get/$PHP_FILENAME/from/this/mirror" -o "$PHP_FILENAME"

  && echo "$PHP_SHA256 *$PHP_FILENAME" | sha256sum -c -

  && curl -fSL "http://php.net/get/$PHP_FILENAME.asc/from/this/mirror" -o "$PHP_FILENAME.asc"

  && export GNUPGHOME="$(mktemp -d)"

  && for key in $GPG_KEYS; do

  gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key";

  done

  && gpg --batch --verify "$PHP_FILENAME.asc" "$PHP_FILENAME"

  && rm -r "$GNUPGHOME" "$PHP_FILENAME.asc"

  && mkdir -p /usr/src/php

  && tar -xf "$PHP_FILENAME" -C /usr/src/php --strip-components=1

  && rm "$PHP_FILENAME"

  && cd /usr/src/php

  && http://edu.jb51.net/docker/configure

  --with-config-file-path="$PHP_INI_DIR"

  --with-config-file-scan-dir="$PHP_INI_DIR/conf.d"

  $PHP_EXTRA_CONFIGURE_ARGS

  --disable-cgi

  # --enable-mysqlnd is included here because it's harder to compile after the fact than extensions are (since it's a plugin for several extensions, not an extension in itself)

  --enable-mysqlnd

  # --enable-mbstring is included here because otherwise there's no way to get pecl to use it properly (see https://github.com/docker-library/php/issues/195)

  --enable-mbstring

  --with-curl

  --with-libedit

  --with-openssl

  --with-zlib

  && make -j"$(nproc)"

  && make install

  && { find /usr/local/bin /usr/local/sbin -type f -executable -exec strip --strip-all '{}' + || true; }

  && make clean

  && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false -o APT::AutoRemove::SuggestsImportant=false $buildDeps

  COPY docker-php-ext-* /usr/local/bin/

  ####

  WORKDIR /var/www/html

  RUN set -ex

  && cd /usr/local/etc

  && if [ -d php-fpm.d ]; then

  # for some reason, upstream's php-fpm.conf.default has "include=NONE/etc/php-fpm.d/*.conf"

  sed 's!=NONE/!=!g' php-fpm.conf.default | tee php-fpm.conf > /dev/null;

  cp php-fpm.d/www.conf.default php-fpm.d/www.conf;

  else

  # PHP 5.x don't use "include=" by default, so we'll create our own simple config that mimics PHP 7+ for consistency

  mkdir php-fpm.d;

  cp php-fpm.conf.default php-fpm.d/www.conf;

  {

  echo '[global]';

  echo 'include=etc/php-fpm.d/*.conf';

  } | tee php-fpm.conf;

  fi

  && {

  echo '[global]';

  echo 'error_log = /proc/self/fd/2';

  echo;

  echo '[www]';

  echo '; if we send this to /proc/self/fd/1, it never appears';

  echo 'access.log = /proc/self/fd/2';

  echo;

  echo 'clear_env = no';

  echo;

  echo '; Ensure worker stdout and stderr are sent to the main error log.';

  echo 'catch_workers_output = yes';

  } | tee php-fpm.d/docker.conf

  && {

  echo '[global]';

  echo 'daemonize = no';

  echo;

  echo '[www]';

  echo 'listen = [::]:9000';

  } | tee php-fpm.d/zz-docker.conf

  EXPOSE 9000

  CMD ["php-fpm"]