Browse Source

init

master
Robin Thoni 8 years ago
commit
9b032d3b5c
6 changed files with 313 additions and 0 deletions
  1. 1
    0
      .gitignore
  2. 129
    0
      Dockerfile
  3. 19
    0
      docker-php-ext-configure
  4. 83
    0
      docker-php-ext-enable
  5. 79
    0
      docker-php-ext-install
  6. 2
    0
      php-cli.ini

+ 1
- 0
.gitignore View File

@@ -0,0 +1 @@
1
+.idea

+ 129
- 0
Dockerfile View File

@@ -0,0 +1,129 @@
1
+FROM debian:jessie
2
+
3
+MAINTAINER Robin Thoni <robin@rthoni.com>
4
+
5
+# Build php
6
+# ======================================================================================================================
7
+
8
+ENV PHPIZE_DEPS \
9
+            autoconf \
10
+            file \
11
+            g++ \
12
+            gcc \
13
+            libc-dev \
14
+            make \
15
+            pkg-config \
16
+            re2c
17
+RUN apt-get update \
18
+        && apt-get install -y \
19
+		    $PHPIZE_DEPS \
20
+		    ca-certificates \
21
+		    curl \
22
+		    libedit2 \
23
+		    libsqlite3-0 \
24
+		    libxml2 \
25
+	        --no-install-recommends \
26
+	    && rm -r /var/lib/apt/lists/*
27
+
28
+ENV PHP_INI_DIR /etc/php7.0
29
+RUN mkdir -p $PHP_INI_DIR/conf.d
30
+
31
+ENV PHP_EXTRA_CONFIGURE_ARGS --enable-maintainer-zts --enable-pthreads
32
+
33
+ENV GPG_KEYS 1A4E8B7277C42E53DBA9C7B9BCAA30EA9C0D5763
34
+
35
+ENV PHP_VERSION 7.0.7
36
+ENV PHP_FILENAME php-7.0.7.tar.xz
37
+ENV PHP_SHA256 9cc64a7459242c79c10e79d74feaf5bae3541f604966ceb600c3d2e8f5fe4794
38
+
39
+RUN set -xe \
40
+        && buildDeps=" \
41
+            libcurl4-openssl-dev \
42
+            libedit-dev \
43
+            libsqlite3-dev \
44
+            libssl-dev \
45
+            libxml2-dev \
46
+            xz-utils \
47
+        " \
48
+        && apt-get update \
49
+        && apt-get install -y $buildDeps --no-install-recommends \
50
+        && rm -rf /var/lib/apt/lists/* \
51
+        && curl -fSL "http://php.net/get/$PHP_FILENAME/from/this/mirror" -o "$PHP_FILENAME" \
52
+        && echo "$PHP_SHA256 *$PHP_FILENAME" | sha256sum -c - \
53
+        && curl -fSL "http://php.net/get/$PHP_FILENAME.asc/from/this/mirror" -o "$PHP_FILENAME.asc" \
54
+        && export GNUPGHOME="$(mktemp -d)" \
55
+        && for key in $GPG_KEYS; do \
56
+            gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
57
+            done \
58
+        && gpg --batch --verify "$PHP_FILENAME.asc" "$PHP_FILENAME" \
59
+        && rm -r "$GNUPGHOME" "$PHP_FILENAME.asc" \
60
+        && mkdir -p /usr/src/php \
61
+        && tar -xf "$PHP_FILENAME" -C /usr/src/php --strip-components=1 \
62
+        && rm "$PHP_FILENAME" \
63
+        && cd /usr/src/php \
64
+        && ./configure \
65
+            --with-config-file-path="$PHP_INI_DIR" \
66
+            --with-config-file-scan-dir="$PHP_INI_DIR/conf.d" \
67
+            $PHP_EXTRA_CONFIGURE_ARGS \
68
+            --disable-cgi \
69
+            --enable-mysqlnd \
70
+            --enable-mbstring \
71
+            --with-curl \
72
+            --with-libedit \
73
+            --with-openssl \
74
+            --with-zlib \
75
+        && make -j"$(nproc)" \
76
+        && make install \
77
+        && { find /usr/local/bin /usr/local/sbin -type f -executable -exec strip --strip-all '{}' + || true; } \
78
+        && make clean \
79
+        && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false -o APT::AutoRemove::SuggestsImportant=false $buildDeps
80
+
81
+RUN pecl install pthreads
82
+
83
+# Install Composer
84
+# ======================================================================================================================
85
+
86
+RUN curl https://getcomposer.org/composer.phar -o /usr/local/bin/composer \
87
+        && chmod +x /usr/local/bin/composer
88
+
89
+RUN apt-get update \
90
+        && apt-get install -y git unzip --no-install-recommends \
91
+        && rm -rf /var/lib/apt/lists/*
92
+
93
+# Add pdo and db drivers
94
+# ======================================================================================================================
95
+
96
+COPY docker-php-ext-* /usr/local/bin/
97
+
98
+RUN buildDeps="libpq-dev libzip-dev " \
99
+        && apt-get update \
100
+        && apt-get install -y $buildDeps --no-install-recommends \
101
+        && rm -rf /var/lib/apt/lists/* \
102
+        && docker-php-ext-install pdo pdo_pgsql pgsql
103
+
104
+# Install PHP config file
105
+# ======================================================================================================================
106
+
107
+COPY php-cli.ini "${PHP_INI_DIR}"/
108
+
109
+# Install sshd
110
+# ======================================================================================================================
111
+
112
+RUN apt-get update \
113
+        && apt-get install -y openssh-server --no-install-recommends \
114
+        && rm -rf /var/lib/apt/lists/*
115
+
116
+RUN mkdir /var/run/sshd
117
+RUN echo 'root:toor' | chpasswd
118
+RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
119
+
120
+RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
121
+
122
+# Run everything
123
+# ======================================================================================================================
124
+
125
+WORKDIR /data
126
+
127
+VOLUME ["/data"]
128
+EXPOSE 22
129
+CMD ["/usr/sbin/sshd", "-D"]

+ 19
- 0
docker-php-ext-configure View File

@@ -0,0 +1,19 @@
1
+#!/bin/sh
2
+set -e
3
+
4
+ext="$1"
5
+extDir="/usr/src/php/ext/$ext"
6
+if [ -z "$ext" ] || ! [ -d "$extDir" ]; then
7
+	echo >&2 "usage: $0 ext-name [configure flags]"
8
+	echo >&2 "   ie: $0 gd --with-jpeg-dir=/usr/local/something"
9
+	echo >&2
10
+	echo >&2 'Possible values for ext-name:'
11
+	echo >&2 $(find /usr/src/php/ext -mindepth 2 -maxdepth 2 -type f -name 'config.m4' | cut -d/ -f6 | sort)
12
+	exit 1
13
+fi
14
+shift
15
+
16
+set -x
17
+cd "$extDir"
18
+phpize
19
+./configure "$@"

+ 83
- 0
docker-php-ext-enable View File

@@ -0,0 +1,83 @@
1
+#!/bin/sh
2
+set -e
3
+
4
+cd "$(php -r 'echo ini_get("extension_dir");')"
5
+
6
+usage() {
7
+	echo "usage: $0 [options] module-name [module-name ...]"
8
+	echo "   ie: $0 gd mysqli"
9
+	echo "       $0 pdo pdo_mysql"
10
+	echo "       $0 --ini-name 0-apc.ini apcu apc"
11
+	echo
12
+	echo 'Possible values for module-name:'
13
+	echo $(find -maxdepth 1 -type f -name '*.so' -exec basename '{}' ';' | sort)
14
+}
15
+
16
+opts="$(getopt -o 'h?' --long 'help,ini-name:' -- "$@" || { usage >&2 && false; })"
17
+eval set -- "$opts"
18
+
19
+iniName=
20
+while true; do
21
+	flag="$1"
22
+	shift
23
+	case "$flag" in
24
+		--help|-h|'-?') usage && exit 0 ;;
25
+		--ini-name) iniName="$1" && shift ;;
26
+		--) break ;;
27
+		*)
28
+			{
29
+				echo "error: unknown flag: $flag"
30
+				usage
31
+			} >&2
32
+			exit 1
33
+			;;
34
+	esac
35
+done
36
+
37
+modules=
38
+for module; do
39
+	if [ -z "$module" ]; then
40
+		continue
41
+	fi
42
+	if [ -f "$module.so" ] && ! [ -f "$module" ]; then
43
+		# allow ".so" to be optional
44
+		module="$module.so"
45
+	fi
46
+	if ! [ -f "$module" ]; then
47
+		echo >&2 "error: $(readlink -f "$module") does not exist"
48
+		echo >&2
49
+		usage >&2
50
+		exit 1
51
+	fi
52
+	modules="$modules $module"
53
+done
54
+
55
+if [ -z "$modules" ]; then
56
+	usage >&2
57
+	exit 1
58
+fi
59
+
60
+for module in $modules; do
61
+	if nm -g "$module" | grep -q ' zend_extension_entry$'; then
62
+		# https://wiki.php.net/internals/extensions#loading_zend_extensions
63
+		line="zend_extension=$(readlink -f "$module")"
64
+	else
65
+		line="extension=$module"
66
+	fi
67
+
68
+	ext="$(basename "$module")"
69
+	ext="${ext%.*}"
70
+	if php -r 'exit(extension_loaded("'"$ext"'") ? 0 : 1);'; then
71
+		# this isn't perfect, but it's better than nothing
72
+		# (for example, 'opcache.so' presents inside PHP as 'Zend OPcache', not 'opcache')
73
+		echo >&2
74
+		echo >&2 "warning: $ext ($module) is already loaded!"
75
+		echo >&2
76
+		continue
77
+	fi
78
+
79
+	ini="${PHP_INI_DIR}/conf.d/${iniName:-"docker-php-ext-$ext.ini"}"
80
+	if ! grep -q "$line" "$ini" 2>/dev/null; then
81
+		echo "$line" >> "$ini"
82
+	fi
83
+done

+ 79
- 0
docker-php-ext-install View File

@@ -0,0 +1,79 @@
1
+#!/bin/sh
2
+set -e
3
+
4
+cd /usr/src/php/ext
5
+
6
+usage() {
7
+	echo "usage: $0 [-jN] ext-name [ext-name ...]"
8
+	echo "   ie: $0 gd mysqli"
9
+	echo "       $0 pdo pdo_mysql"
10
+	echo "       $0 -j5 gd mbstring mysqli pdo pdo_mysql shmop"
11
+	echo
12
+	echo 'if custom ./configure arguments are necessary, see docker-php-ext-configure'
13
+	echo
14
+	echo 'Possible values for ext-name:'
15
+	echo $(find /usr/src/php/ext -mindepth 2 -maxdepth 2 -type f -name 'config.m4' | cut -d/ -f6 | sort)
16
+}
17
+
18
+opts="$(getopt -o 'h?j:' --long 'help,jobs:' -- "$@" || { usage >&2 && false; })"
19
+eval set -- "$opts"
20
+
21
+j=1
22
+while true; do
23
+	flag="$1"
24
+	shift
25
+	case "$flag" in
26
+		--help|-h|'-?') usage && exit 0 ;;
27
+		--jobs|-j) j="$1" && shift ;;
28
+		--) break ;;
29
+		*)
30
+			{
31
+				echo "error: unknown flag: $flag"
32
+				usage
33
+			} >&2
34
+			exit 1
35
+			;;
36
+	esac
37
+done
38
+
39
+exts=
40
+for ext; do
41
+	if [ -z "$ext" ]; then
42
+		continue
43
+	fi
44
+	if [ ! -d "$ext" ]; then
45
+		echo >&2 "error: $(pwd -P)/$ext does not exist"
46
+		echo >&2
47
+		usage >&2
48
+		exit 1
49
+	fi
50
+	exts="$exts $ext"
51
+done
52
+
53
+if [ -z "$exts" ]; then
54
+	usage >&2
55
+	exit 1
56
+fi
57
+
58
+if [ -e /lib/apk/db/installed ] && [ -n "$PHPIZE_DEPS" ]; then
59
+	apk add --no-cache --virtual .phpize-deps $PHPIZE_DEPS
60
+fi
61
+
62
+for ext in $exts; do
63
+	(
64
+		cd "$ext"
65
+		[ -e Makefile ] || docker-php-ext-configure "$ext"
66
+		make -j"$j"
67
+		make -j"$j" install
68
+		find modules \
69
+			-maxdepth 1 \
70
+			-name '*.so' \
71
+			-exec basename '{}' ';' \
72
+				| xargs -r docker-php-ext-enable
73
+		make -j"$j" clean
74
+	)
75
+done
76
+
77
+if [ -e /lib/apk/db/installed ] && [ -n "$PHPIZE_DEPS" ]; then
78
+	apk del .phpize-deps
79
+fi

+ 2
- 0
php-cli.ini View File

@@ -0,0 +1,2 @@
1
+[PHP]
2
+extension=pthreads.so

Loading…
Cancel
Save