├── alpine-mailhog └── Dockerfile ├── alpine-sphinx └── 2.2 │ └── Dockerfile ├── README.md ├── alpine-redis └── Dockerfile ├── alpine-memcached └── Dockerfile ├── alpine-tarantool └── Dockerfile ├── alpine-nginx └── Dockerfile ├── alpine-v8 └── Dockerfile └── alpine-php └── Dockerfile /alpine-mailhog/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.15 as build 2 | 3 | LABEL repository.hub="alexmasterov/alpine-mailhog" \ 4 | repository.url="https://github.com/AlexMasterov/dockerfiles" \ 5 | maintainer="Alex Masterov " 6 | 7 | ARG MAILHOG_VERSION=1.0.1 8 | 9 | RUN set -eux; \ 10 | apk add --no-cache \ 11 | gcc \ 12 | git \ 13 | go \ 14 | upx \ 15 | ; \ 16 | : "-- MailHog: download source & build"; \ 17 | go install \ 18 | -gcflags=all='-l -B' \ 19 | -ldflags '-s -w -linkmode external -extldflags -static' \ 20 | github.com/mailhog/MailHog@v${MAILHOG_VERSION}; \ 21 | \ 22 | upx --no-color --no-progress --best --lzma \ 23 | /root/go/bin/MailHog 24 | 25 | FROM scratch as runtime 26 | 27 | COPY --from=build /root/go/bin/MailHog /MailHog 28 | 29 | ENTRYPOINT ["/MailHog"] 30 | -------------------------------------------------------------------------------- /alpine-sphinx/2.2/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.13 2 | 3 | LABEL repository.hub="alexmasterov/alpine-sphinx:2.2" \ 4 | repository.url="https://github.com/AlexMasterov/dockerfiles" \ 5 | maintainer="Alex Masterov " 6 | 7 | ARG SPHINX_VERSION=2.2.11-release 8 | 9 | RUN set -eux; \ 10 | apk add --no-cache \ 11 | tzdata; \ 12 | addgroup -g 82 -S sphinx; \ 13 | adduser -u 82 -S -D -h /var/cache/sphinx -s /sbin/nologin -G sphinx sphinx 14 | 15 | RUN set -eux; \ 16 | load_archive() { wget ${1} -T 30 -O - | tar xz -C /tmp; }; \ 17 | apk add --no-cache --virtual .sphinx-build \ 18 | expat-dev \ 19 | g++ \ 20 | gcc \ 21 | make \ 22 | mariadb-connector-c-dev \ 23 | patch \ 24 | postgresql-dev \ 25 | re2-dev \ 26 | snowball-dev; \ 27 | : "-- Download Sphinx"; \ 28 | load_archive "https://sphinxsearch.com/files/sphinx-${SPHINX_VERSION}.tar.gz"; \ 29 | cd /tmp/sphinx-${SPHINX_VERSION}; \ 30 | : "-- Patch 'src/sphinx.cpp': pagesize"; \ 31 | PAGESIZE_PATCH="https://git.alpinelinux.org/cgit/aports/plain/community/sphinx/sphinx-pagesize.patch"; \ 32 | wget ${PAGESIZE_PATCH} -T 30 -O - | patch -p1 -u; \ 33 | : "-- Build Sphinx"; \ 34 | ./configure \ 35 | --prefix=/usr \ 36 | --exec-prefix=/usr \ 37 | --sysconfdir=/etc/sphinx \ 38 | --localstatedir=/var/lib/sphinx \ 39 | --enable-id64 \ 40 | --with-iconv \ 41 | --with-libexpat \ 42 | --with-libstemmer \ 43 | --with-mysql \ 44 | --with-pgsql \ 45 | --with-re2; \ 46 | make -j $(getconf _NPROCESSORS_ONLN); \ 47 | make install; \ 48 | runtime_deps="$( \ 49 | scanelf --needed --nobanner -F '%n#p' /usr/bin/searchd \ 50 | | tr ',' '\n' \ 51 | | sort -u \ 52 | | sed 's/^/so:&/' \ 53 | )"; \ 54 | apk add --no-cache --virtual .sphinx-runtime ${runtime_deps}; \ 55 | : "-- Strip files"; \ 56 | find /usr/bin -type f -perm +0111 -exec strip --strip-unneeded '{}' + || true; \ 57 | : "-- Remove build dependencies, clean temporary files"; \ 58 | apk del --no-network .sphinx-build; \ 59 | rm -rf /tmp/* /var/tmp/* 60 | 61 | CMD ["searchd"] 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # dockerfiles 2 | 3 | Common Dockerfiles, used for _development_. 4 | 5 | - [alpine-v8](#alpine-v8) 6 | - [alpine-php](#alpine-php) 7 | 8 | #### alpine-v8 9 | 10 | ```sh 11 | docker build --build-arg V8_VERSION=stable --rm -t v8 github.com/AlexMasterov/dockerfiles.git#:alpine-v8 12 | ``` 13 | > V8_VERSION >= 6.1.211 | 6.1 | dev | beta | stable | latest 14 | 15 | ##### FAQ 16 | 17 |
18 | How do I get an archive with V8? 19 | 20 | ```sh 21 | docker run --rm -v "$(pwd)/:/archive" v8 sh -c 'tar cvzf /archive/libv8-${V8_VERSION}.tar.gz *' 22 | ``` 23 |
24 | 25 |
26 | How do I get shell (d8)? 27 | 28 | ```sh 29 | docker build \ 30 | --build-arg V8_VERSION=stable \ 31 | --build-arg V8_SHELL=YES \ 32 | --rm -t v8 github.com/AlexMasterov/dockerfiles.git#:alpine-v8 33 | ``` 34 | ```sh 35 | docker run --rm -it v8 d8 36 | ``` 37 |
38 | 39 |
40 | How do I get static libraries (.a)? 41 | 42 | ```sh 43 | docker build \ 44 | --build-arg V8_VERSION=stable \ 45 | --build-arg V8_STATIC_LIB=YES \ 46 | --rm -t v8 github.com/AlexMasterov/dockerfiles.git#:alpine-v8 47 | ``` 48 |
49 | 50 |
51 | How do I get monolithic static library (.a)? 52 | 53 | ```sh 54 | docker build \ 55 | --build-arg V8_VERSION=stable \ 56 | --build-arg V8_MONOLITHIC=YES \ 57 | --rm -t v8 github.com/AlexMasterov/dockerfiles.git#:alpine-v8 58 | ``` 59 |
60 | 61 |
62 | I have build issues 63 | 64 | I get this error message: 65 | ```sh 66 | ERROR at //gni/v8.gni:103:3: Dependency not allowed. 67 | target(link_target_type, target_name) { 68 | ^-------------------------------------- 69 | The item //src/inspector:inspector 70 | can not depend on //:features 71 | because it is not in //:features's visibility list: [ 72 | //.:* 73 | ] 74 | ``` 75 | Try to use: 76 | 1. `--build-arg USE_GN_SOURCE=YES` 77 | 2. `--build-arg USE_GN_SOURCE=YES --build-arg GN_SOURCE_REV=9434c3d281eefb5c3764b5a0575feec9c59bd095` 78 | 79 | > `GN_SOURCE_REV` can be any revision on the _working_ repository: [gn.googlesource.com/gn](https://gn.googlesource.com/gn). 80 | 81 |
82 | 83 | #### alpine-php 84 | ```sh 85 | docker build --build-arg PHP_VERSION=8.0 --rm -t php github.com/AlexMasterov/dockerfiles.git#:alpine-php 86 | ``` 87 | > PHP_VERSION >= 7.0.0 | 7.0 88 | -------------------------------------------------------------------------------- /alpine-redis/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.15 as build 2 | 3 | LABEL repository.hub="alexmasterov/alpine-redis" \ 4 | repository.url="https://github.com/AlexMasterov/dockerfiles" \ 5 | maintainer="Alex Masterov " 6 | 7 | # >= 3.2.0 8 | ARG REDIS_VERSION=6.2.6 9 | 10 | ARG REDIS_CLI=NO 11 | ARG REDIS_SERVER=YES 12 | ARG REDIS_BENCHMARK=NO 13 | ARG REDIS_TLS=YES 14 | 15 | ARG REDIS_EXTRA_CFLAGS 16 | 17 | ARG JEMALLOC_LG_PAGE 18 | ARG JEMALLOC_LG_HUGEPAGE 19 | ARG JEMALLOC_LG_QUANTUM=3 20 | ARG JEMALLOC_EXTRA_CONFIGURE="--disable-stats --disable-lazy-lock" 21 | 22 | ARG OUT_STRIP=YES 23 | 24 | ARG USE_TZ=YES 25 | ARG TZ="Europe/Moscow" 26 | 27 | RUN set -eux; \ 28 | as_ver() { set -- ${1//./ }; local y="00${2:-0}" z="00${3:-0}"; echo "${1}${y:(-3)}${z:(-3)}"; }; \ 29 | compare_ver() { test $(as_ver ${1}) -${2} $(as_ver ${3}); }; \ 30 | if_redis_ver() { if compare_ver ${REDIS_VERSION} ${1} ${2}; then shift 2; echo "${*:-}"; fi; }; \ 31 | if_yes() { if [ ${1} = 'YES' ]; then shift 1; echo ${*:-}; fi; }; \ 32 | load_archive() { wget ${1} -T 30 -O - | tar ${2:-xmz} -C /tmp; }; \ 33 | \ 34 | apk add --no-cache --virtual .redis-build \ 35 | gcc \ 36 | make \ 37 | musl-dev \ 38 | pkgconf \ 39 | $(if_redis_ver le 6.0.11 linux-headers) \ 40 | $(if_redis_ver ge 6.0.0 $(if_yes ${REDIS_TLS} \ 41 | openssl-dev \ 42 | openssl-libs-static \ 43 | )) \ 44 | \ 45 | upx \ 46 | $(if_yes ${USE_TZ} tzdata) \ 47 | ; \ 48 | : "-- Redis: download source"; \ 49 | load_archive "https://download.redis.io/releases/redis-${REDIS_VERSION}.tar.gz"; \ 50 | cd /tmp/redis-${REDIS_VERSION}/src; \ 51 | \ 52 | : "-- jemalloc: configure"; \ 53 | jemalloc_extra_configure=" \ 54 | ${JEMALLOC_LG_QUANTUM:+--with-lg-quantum=${JEMALLOC_LG_QUANTUM}} \ 55 | ${JEMALLOC_LG_HUGEPAGE:+--with-lg-hugepage=${JEMALLOC_LG_HUGEPAGE}} \ 56 | ${JEMALLOC_LG_PAGE:+--with-lg-page=${JEMALLOC_LG_PAGE}} \ 57 | ${JEMALLOC_EXTRA_CONFIGURE:-} \ 58 | "; \ 59 | sed -ri "s/(pthread_create_fptr) = dlsym.*;/\1 = pthread_create;/" ../deps/jemalloc/src/background_thread.c; \ 60 | sed -ri \ 61 | -e "s/\s?--with-lg-(page|hugepage|quantum)=\d+//g" \ 62 | -e "s/cd jemalloc && .\/configure.*/& ${jemalloc_extra_configure// [[:space:]]/}/" \ 63 | ../deps/Makefile; \ 64 | \ 65 | : "-- Redis: disable protected mode"; \ 66 | sed -i "s/(server.protected_mode), 1/\1, 0/" config.c; \ 67 | : "-- Redis: build"; \ 68 | build_targets="\ 69 | $(if_yes ${REDIS_CLI} redis-cli) \ 70 | $(if_yes ${REDIS_SERVER} redis-server) \ 71 | $(if_yes ${REDIS_BENCHMARK} redis-benchmark) \ 72 | "; \ 73 | make \ 74 | ${build_targets} \ 75 | $(if_redis_ver ge 6.0.0 $(if_yes ${REDIS_TLS} BUILD_TLS=yes)) \ 76 | LDFLAGS="-static" \ 77 | EXTRA_CFLAGS="${REDIS_EXTRA_CFLAGS:-}" \ 78 | -j $(getconf _NPROCESSORS_ONLN) \ 79 | ; \ 80 | : "-- Redis: install"; \ 81 | mv ${build_targets} /usr/local/bin; \ 82 | \ 83 | if [ ${OUT_STRIP} = 'YES' ]; then \ 84 | : "-- Out: strip executables"; \ 85 | find /usr/local -type f -executable \ 86 | -exec strip --strip-unneeded '{}' + || true; \ 87 | fi; \ 88 | \ 89 | upx --no-color --no-progress --best --lzma \ 90 | /usr/local/bin/*; \ 91 | \ 92 | mkdir -p /out; \ 93 | cp --recursive --dereference --link \ 94 | /usr/local/bin/ \ 95 | /out; \ 96 | \ 97 | if [ ${USE_TZ} = 'YES' ]; then \ 98 | cp /usr/share/zoneinfo/${TZ} /etc/localtime; \ 99 | echo "${TZ}" > /etc/timezone; \ 100 | \ 101 | cp --recursive --parents --dereference --link \ 102 | /etc/timezone \ 103 | /etc/localtime \ 104 | /out; \ 105 | fi; 106 | 107 | FROM scratch as runtime 108 | 109 | COPY --from=build /out / 110 | 111 | ENTRYPOINT ["/bin/redis-server"] 112 | -------------------------------------------------------------------------------- /alpine-memcached/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.15 as build 2 | 3 | LABEL repository.hub="alexmasterov/alpine-memcached" \ 4 | repository.url="https://github.com/AlexMasterov/dockerfiles" \ 5 | maintainer="Alex Masterov " 6 | 7 | # >= 1.6.1 8 | ARG MEMCACHED_VERSION=1.6.15 9 | 10 | ARG MEMCACHED_TLS=YES 11 | ARG MEMCACHED_EXTSTORE=YES 12 | ARG MEMCACHED_SECCOMP=YES 13 | ARG MEMCACHED_64BIT=NO 14 | 15 | ARG MEMCACHED_CFLAGS="-O2" 16 | 17 | ARG OUT_STRIP=YES 18 | 19 | ARG USE_TZ=YES 20 | ARG TZ="Europe/Moscow" 21 | 22 | RUN set -eux; \ 23 | as_ver() { set -- ${1//./ }; local y="00${2:-0}" z="00${3:-0}"; echo "${1}${y:(-3)}${z:(-3)}"; }; \ 24 | compare_ver() { test $(as_ver ${1}) -${2} $(as_ver ${3}); }; \ 25 | get_deps() { find ${*:-} -type f -and \( -executable -or -name '*.so*' \) -exec ldd '{}' ';' | sed -rn "s/\s*(.* => )?(.*) \(.*/\2/p" | sort -u; }; \ 26 | if_memcached_ver() { if compare_ver ${MEMCACHED_VERSION} ${1} ${2}; then shift 2; echo "${*:-}"; fi; }; \ 27 | if_no() { if [ ${1} = 'NO' ]; then shift 1; echo ${*:-}; fi; }; \ 28 | if_yes() { if [ ${1} = 'YES' ]; then shift 1; echo ${*:-}; fi; }; \ 29 | load_archive() { wget ${1} -T 30 -O - | tar ${2:-xmz} -C /tmp; }; \ 30 | \ 31 | apk add --no-cache --virtual .memcached-build \ 32 | autoconf \ 33 | automake \ 34 | g++ \ 35 | gcc \ 36 | libevent-dev \ 37 | libevent-static \ 38 | make \ 39 | $(if_memcached_ver ge 1.6.11 bsd-compat-headers) \ 40 | $(if_yes ${MEMCACHED_SECCOMP} libseccomp-dev) \ 41 | $(if_yes ${MEMCACHED_TLS} \ 42 | openssl-dev \ 43 | openssl-libs-static \ 44 | ) \ 45 | \ 46 | $(if_yes ${OUT_STRIP} upx) \ 47 | $(if_yes ${USE_TZ} tzdata) \ 48 | ; \ 49 | : "-- Memcached: download source"; \ 50 | load_archive "https://memcached.org/files/memcached-${MEMCACHED_VERSION}.tar.gz"; \ 51 | cd /tmp/memcached-${MEMCACHED_VERSION}; \ 52 | : "-- Memcached: patch"; \ 53 | sed -i "s/if test \"x\$ac_cv_search_pthread_create\".*/if false; then/" configure configure.ac; \ 54 | if compare_ver ${MEMCACHED_VERSION} le 1.6.12 && compare_ver ${MEMCACHED_VERSION} ge 1.6.11; then \ 55 | : "-- Fix BSD header include (queue)"; \ 56 | sed -ri "s/(#include) \"queue.h\"/\1 /" thread.c cache.h; \ 57 | fi; \ 58 | : "-- Memcached: build"; \ 59 | if compare_ver ${MEMCACHED_VERSION} le 1.6.10; then \ 60 | autoreconf; \ 61 | fi; \ 62 | ./configure \ 63 | --enable-static \ 64 | --disable-docs \ 65 | --disable-coverage \ 66 | --$(if_yes ${MEMCACHED_TLS} enable)$(if_no ${MEMCACHED_TLS} disable)-tls \ 67 | --$(if_yes ${MEMCACHED_EXTSTORE} enable)$(if_no ${MEMCACHED_EXTSTORE} disable)-extstore \ 68 | --$(if_yes ${MEMCACHED_SECCOMP} enable)$(if_no ${MEMCACHED_SECCOMP} disable)-seccomp \ 69 | --$(if_yes ${MEMCACHED_64BIT} enable)$(if_no ${MEMCACHED_64BIT} disable)-64bit \ 70 | CFLAGS="${MEMCACHED_CFLAGS:-}" \ 71 | CPPFLAGS="${MEMCACHED_CFLAGS:-}"; \ 72 | make memcached -j $(getconf _NPROCESSORS_ONLN); \ 73 | : "-- Memcached: install"; \ 74 | mv memcached /usr/local/bin; \ 75 | \ 76 | if [ ${OUT_STRIP} = 'YES' ]; then \ 77 | : "-- Out: strip executables"; \ 78 | find /usr/local -type f -executable \ 79 | -exec strip --strip-unneeded '{}' + || true; \ 80 | upx --no-color --no-progress --best --lzma \ 81 | /usr/local/bin/* || true; \ 82 | fi; \ 83 | \ 84 | mkdir -p /out; \ 85 | cp --recursive --dereference --link \ 86 | /usr/local/bin/ \ 87 | /out; \ 88 | \ 89 | if [ ${USE_TZ} = 'YES' ]; then \ 90 | echo "${TZ}" > /etc/timezone; \ 91 | cp /usr/share/zoneinfo/${TZ} /etc/localtime; \ 92 | \ 93 | cp --recursive --parents --dereference --link \ 94 | /etc/timezone \ 95 | /etc/localtime \ 96 | /out; \ 97 | fi; 98 | 99 | FROM busybox as runtime 100 | 101 | COPY --from=build /out / 102 | 103 | ENTRYPOINT ["/bin/memcached"] 104 | -------------------------------------------------------------------------------- /alpine-tarantool/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.14 2 | 3 | LABEL repository.hub="alexmasterov/alpine-tarantool" \ 4 | repository.url="https://github.com/AlexMasterov/dockerfiles" \ 5 | maintainer="Alex Masterov " 6 | 7 | ARG TARANTOOL_TAG=2.7.1-0-g3ac498c9f 8 | 9 | ARG TARANTOOL_BUILD_TYPE=RelWithDebInfo 10 | ARG TARANTOOL_AVX=YES 11 | ARG TARANTOOL_BACKTRACE=YES 12 | ARG TARANTOOL_BUNDLED_LIBCURL=NO 13 | ARG TARANTOOL_BUNDLED_LIBCURL_ARES=NO 14 | ARG TARANTOOL_BUNDLED_LIBYAML=NO 15 | ARG TARANTOOL_BUNDLED_ZSTD=NO 16 | ARG TARANTOOL_DIST=NO 17 | 18 | ARG LUAJIT_GC64=YES 19 | 20 | # Dynamically linked musl does not support (issue 693) 21 | ARG USE_GPERFTOOLS=NO 22 | ARG GPERFTOOLS_VERSION=2.9.1 23 | ARG GPERFTOOLS_CPU_PROFILER=YES 24 | ARG GPERFTOOLS_HEAP_PROFILER=YES 25 | ARG GPERFTOOLS_HEAP_CHECKER=YES 26 | 27 | ARG USE_PPROF=NO 28 | ARG PPROF_REV 29 | 30 | ARG USE_TZ=NO 31 | ARG LIB_SSL=OPENSSL 32 | 33 | ARG OUT_STRIP=YES 34 | 35 | RUN set -eux; \ 36 | get_deps() { scanelf --nobanner --needed --recursive -F '%n#p' ${*:-} | tr ',' '\n' | sort -u; }; \ 37 | if_no() { if [ ${1} = 'NO' ]; then shift 1; echo "${*:-}"; fi; }; \ 38 | if_yes() { if [ ${1} = 'YES' ]; then shift 1; echo "${*:-}"; fi; }; \ 39 | load_archive() { wget ${1} -T 30 -O - | tar ${2:-xmz} -C /tmp; }; \ 40 | to_lowercase() { echo "${1:-}" | tr '[:upper:]' '[:lower:]'; }; \ 41 | \ 42 | addgroup -g 82 -S tarantool; \ 43 | adduser -u 82 -S -D -h /var/cache/tarantool -s /sbin/nologin -G tarantool tarantool; \ 44 | \ 45 | apk add --no-cache --virtual .tarantool-build \ 46 | cmake \ 47 | g++ \ 48 | gcc \ 49 | git \ 50 | icu-dev \ 51 | make \ 52 | ncurses-dev \ 53 | readline-dev \ 54 | $(to_lowercase ${LIB_SSL:-OPENSSL})-dev \ 55 | $(if_yes ${TARANTOOL_BACKTRACE} libunwind-dev) \ 56 | $(if_yes ${TARANTOOL_BUNDLED_LIBCURL} autoconf) \ 57 | $(if_no ${TARANTOOL_BUNDLED_LIBCURL} curl-dev) \ 58 | $(if_no ${TARANTOOL_BUNDLED_LIBYAML} yaml-dev) \ 59 | $(if_no ${TARANTOOL_BUNDLED_ZSTD} zstd-dev) \ 60 | \ 61 | $(if_yes ${USE_GPERFTOOLS} linux-headers) \ 62 | $(if_yes ${USE_PPROF} go) \ 63 | ; \ 64 | if [ ${USE_TZ} = 'YES' ]; then \ 65 | apk add --no-cache --virtual .tarantool-tz tzdata; \ 66 | fi; \ 67 | : "-- Tarantool: download source"; \ 68 | git clone \ 69 | --no-progress \ 70 | --no-checkout \ 71 | --filter=blob:none \ 72 | https://github.com/tarantool/tarantool.git /tmp/tarantool; \ 73 | git -C /tmp/tarantool checkout ${TARANTOOL_TAG}; \ 74 | \ 75 | cd /tmp/tarantool; \ 76 | : "-- Patch: CMakeLists.txt (remove update_submodules)"; \ 77 | sed -i '/update_submodules()/d' CMakeLists.txt; \ 78 | : "-- Git: update submodules"; \ 79 | git \ 80 | -c submodule."test-run".update=none \ 81 | $(if_no ${TARANTOOL_BUNDLED_ZSTD} -c submodule."third_party/zstd".update=none) \ 82 | $(if_no ${TARANTOOL_BUNDLED_LIBYAML} -c submodule."third_party/libyaml".update=none) \ 83 | $(if_no ${TARANTOOL_BUNDLED_LIBCURL} -c submodule."third_party/curl".update=none) \ 84 | $(if_no ${TARANTOOL_BUNDLED_LIBCURL_ARES} -c submodule."third_party/c-ares".update=none) \ 85 | submodule update \ 86 | --init \ 87 | --recursive \ 88 | --jobs $(getconf _NPROCESSORS_ONLN); \ 89 | \ 90 | : "-- Patch: lib/{msgpuck,small}/CMakeLists.txt (remove test)"; \ 91 | sed -i '/add_subdirectory(test)/d' CMakeLists.txt; \ 92 | sed -i "s/if (NOT \${PROJECT_SOURCE_DIR}.*)/if (TRUE)/" src/lib/msgpuck/CMakeLists.txt; \ 93 | sed -ri "/(enable_testing\(\)|add_subdirectory\((test|perf)\))/d" src/lib/small/CMakeLists.txt; \ 94 | \ 95 | : "-- Tarantool: build"; \ 96 | cmake \ 97 | -DCMAKE_BUILD_TYPE=${TARANTOOL_BUILD_TYPE:-RelWithDebInfo} \ 98 | -DENABLE_BACKTRACE:BOOL=${TARANTOOL_BACKTRACE} \ 99 | -DENABLE_DIST:BOOL=${TARANTOOL_DIST} \ 100 | -DENABLE_AVX:BOOL=${TARANTOOL_AVX} \ 101 | -DENABLE_BUNDLED_LIBCURL:BOOL=${TARANTOOL_BUNDLED_LIBCURL} \ 102 | -DENABLE_BUNDLED_LIBYAML:BOOL=${TARANTOOL_BUNDLED_LIBYAML} \ 103 | -DENABLE_BUNDLED_ZSTD:BOOL=${TARANTOOL_BUNDLED_ZSTD} \ 104 | -DLUAJIT_ENABLE_GC64:BOOL=${LUAJIT_GC64} \ 105 | .; \ 106 | make -j $(getconf _NPROCESSORS_ONLN); \ 107 | make install; \ 108 | \ 109 | if [ ${USE_GPERFTOOLS} = 'YES' ]; then \ 110 | : "-- gperftools: download source"; \ 111 | load_archive "https://github.com/gperftools/gperftools/archive/refs/tags/gperftools-${GPERFTOOLS_VERSION}.tar.gz"; \ 112 | cd /tmp/gperftools-gperftools-${GPERFTOOLS_VERSION}; \ 113 | : "-- gperftools: build"; \ 114 | cmake \ 115 | -DBUILD_TESTING:BOOL=NO \ 116 | -DGPERFTOOLS_BUILD_DEBUGALLOC:BOOL=NO \ 117 | -Dgperftools_build_benchmark:BOOL=NO \ 118 | -DDEFAULT_BUILD_CPU_PROFILER:BOOL=${GPERFTOOLS_CPU_PROFILER} \ 119 | -DDEFAULT_BUILD_HEAP_PROFILER:BOOL=${GPERFTOOLS_HEAP_PROFILER} \ 120 | -DDEFAULT_BUILD_HEAP_CHECKER:BOOL=${GPERFTOOLS_HEAP_CHECKER} \ 121 | .; \ 122 | make \ 123 | -j $(getconf _NPROCESSORS_ONLN) \ 124 | profiler; \ 125 | mv libprofiler.so* /usr/local/lib; \ 126 | fi; \ 127 | if [ ${USE_PPROF} = 'YES' ]; then \ 128 | export \ 129 | GO111MODULE=on \ 130 | GOPATH=/tmp/go \ 131 | GOCACHE=/tmp/go/.cache; \ 132 | : "-- pprof: build"; \ 133 | go get github.com/google/pprof@${PPROF_REV:-master}; \ 134 | mv /tmp/go/bin/pprof /usr/local/bin; \ 135 | fi; \ 136 | \ 137 | if [ ${OUT_STRIP} = 'YES' ]; then \ 138 | : "-- Out: strip executables"; \ 139 | find /usr/local -type f -executable \ 140 | -exec strip --strip-unneeded '{}' + || true; \ 141 | fi; \ 142 | \ 143 | apk add --no-cache --virtual .tarantool-runtime \ 144 | $(if_yes ${TARANTOOL_DIST} curl git) \ 145 | $(get_deps /usr/local/bin /usr/local/lib | sed "s/^/so:&/"); \ 146 | \ 147 | : "-- Remove build dependencies, clean temporary files"; \ 148 | apk del --no-network .tarantool-build; \ 149 | rm -rf /tmp/* /var/tmp/* 150 | 151 | USER tarantool 152 | 153 | CMD ["tarantool"] 154 | -------------------------------------------------------------------------------- /alpine-nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.15 2 | 3 | LABEL repository.hub="alexmasterov/alpine-nginx" \ 4 | repository.url="https://github.com/AlexMasterov/dockerfiles" \ 5 | maintainer="Alex Masterov " 6 | 7 | ARG NGINX_VERSION=1.21.4 8 | 9 | ARG NGINX_CONFIG=/etc/nginx 10 | ARG NGINX_EXTRA_CCFLAGS="-O2 -fstack-protector-strong -flto -fPIC -fpie" 11 | ARG NGINX_EXTRA_LDFLAGS="-O2 -pie" 12 | 13 | ARG HTTP_DEGRADATION=NO 14 | ARG HTTP_GUNZIP=NO 15 | ARG HTTP_GZIP=YES 16 | ARG HTTP_GZIP_STATIC=NO 17 | ARG HTTP_REFERER=NO 18 | ARG HTTP_SECURE_LINK=NO 19 | ARG HTTP_SLICE=NO 20 | ARG HTTP_SPLIT_CLIENTS=NO 21 | ARG HTTP_SSL=YES 22 | ARG HTTP_STREAM=YES 23 | ARG HTTP_STREAM_SSL=YES 24 | ARG HTTP_V2=YES 25 | 26 | ARG BROTLI=NO 27 | ARG BROTLI_VERSION=1.0.0rc 28 | 29 | ARG HEADERS_MORE=NO 30 | ARG HEADERS_MORE_VERSION=0.33 31 | 32 | ARG NJS=NO 33 | ARG NJS_VERSION=0.7.0 34 | 35 | # OpenResty 36 | ARG LUA=NO 37 | ARG LUA_VERSION=0.10.20 38 | ARG LUA_JIT_VERSION=2.1-20210510 39 | ARG LUA_STREAM_VERSION=0.0.10 40 | ARG LUA_RESTY_LRUCACHE_VERSION=0.11 41 | ARG LUA_ROCKS=NO 42 | ARG LUA_ROCKS_VERSION=3.8.0 43 | ARG DEVEL_KIT_VERSION=0.3.1 44 | 45 | ARG TARANTOOL_UPSTREAM=NO 46 | ARG TARANTOOL_UPSTREAM_VERSION=2.7.1 47 | ARG MSGPUCK_VERSION=2.0 48 | 49 | ARG USE_TZ=YES 50 | ARG LIB_SSL=OPENSSL 51 | 52 | ARG OUT_STRIP=YES 53 | 54 | RUN set -eux; \ 55 | contains() { if [ -z ${1##*${2}*} ]; then shift 2; echo ${*:-}; fi; }; \ 56 | get_deps() { find ${*:-} -type f -and \( -executable -or -name '*.so*' \) -exec ldd '{}' ';' | sed -rn "s/\s*(.* => )?(.*) \(.*/\2/p" | sort -u; }; \ 57 | if_no() { if [ ${1} = 'NO' ]; then shift 1; echo ${*:-}; fi; }; \ 58 | if_yes() { if [ ${1} = 'YES' ]; then shift 1; echo ${*:-}; fi; }; \ 59 | load_archive() { wget ${1} -T 30 -O - | tar ${2:-xmz} -C /tmp; }; \ 60 | to_lowercase() { echo ${1:-} | tr '[:upper:]' '[:lower:]'; }; \ 61 | \ 62 | apk add --no-cache --virtual .nginx-build \ 63 | g++ \ 64 | gcc \ 65 | linux-headers \ 66 | make \ 67 | pcre-dev \ 68 | $(contains "${HTTP_SSL}${HTTP_STREAM_SSL}" 'YES' $(to_lowercase ${LIB_SSL})-dev) \ 69 | \ 70 | $(if_yes ${HTTP_GZIP} zlib-dev) \ 71 | $(if_yes ${BROTLI} brotli-dev) \ 72 | $(if_yes ${TARANTOOL_UPSTREAM} \ 73 | cmake \ 74 | yajl-dev \ 75 | ) \ 76 | ; \ 77 | if [ ${USE_TZ} = 'YES' ]; then \ 78 | apk add --no-cache --virtual .nginx-tz tzdata; \ 79 | fi; \ 80 | : "-- make: setup flags"; \ 81 | export MAKEFLAGS="-j $(( $(getconf _NPROCESSORS_ONLN) - 1 ))"; \ 82 | \ 83 | : "-- Nginx: setup modules"; \ 84 | if [ ${BROTLI} = 'YES' ]; then \ 85 | load_archive "https://github.com/google/ngx_brotli/archive/v${BROTLI_VERSION}.tar.gz"; \ 86 | fi; \ 87 | if [ ${HEADERS_MORE} = 'YES' ]; then \ 88 | load_archive "https://github.com/openresty/headers-more-nginx-module/archive/v${HEADERS_MORE_VERSION}.tar.gz"; \ 89 | fi; \ 90 | if [ ${NJS} = 'YES' ]; then \ 91 | load_archive "https://github.com/nginx/njs/archive/${NJS_VERSION}.tar.gz"; \ 92 | fi; \ 93 | if [ ${LUA} = 'YES' ]; then \ 94 | load_archive "https://github.com/openresty/lua-nginx-module/archive/v${LUA_VERSION}.tar.gz"; \ 95 | load_archive "https://github.com/openresty/stream-lua-nginx-module/archive/refs/tags/v${LUA_STREAM_VERSION}.tar.gz"; \ 96 | load_archive "https://github.com/openresty/lua-resty-lrucache/archive/refs/tags/v${LUA_RESTY_LRUCACHE_VERSION}.tar.gz"; \ 97 | load_archive "https://github.com/vision5/ngx_devel_kit/archive/v${DEVEL_KIT_VERSION}.tar.gz"; \ 98 | load_archive "https://github.com/openresty/luajit2/archive/v${LUA_JIT_VERSION}.tar.gz"; \ 99 | export \ 100 | LUAJIT_BIN=/usr/local/bin \ 101 | LUAJIT_LIB=/usr/local/lib \ 102 | LUAJIT_INC=/usr/local/include; \ 103 | cd /tmp/luajit2-${LUA_JIT_VERSION}; \ 104 | make; \ 105 | make install \ 106 | INSTALL_BIN=${LUAJIT_BIN} \ 107 | INSTALL_LIB=${LUAJIT_LIB} \ 108 | INSTALL_INC=${LUAJIT_INC} \ 109 | INSTALL_MAN=/luajit2; \ 110 | \ 111 | if [ ${LUA_ROCKS} = 'YES' ]; then \ 112 | load_archive "https://github.com/luarocks/luarocks/archive/v${LUA_ROCKS_VERSION}.tar.gz"; \ 113 | cd /tmp/luarocks-${LUA_ROCKS_VERSION}; \ 114 | ./configure \ 115 | --with-lua-bin=${LUAJIT_BIN} \ 116 | --with-lua-lib=${LUAJIT_LIB} \ 117 | --with-lua-include=${LUAJIT_INC} \ 118 | --force-config \ 119 | --disable-incdir-check; \ 120 | make luarocks; \ 121 | make install; \ 122 | fi; \ 123 | fi; \ 124 | if [ ${TARANTOOL_UPSTREAM} = 'YES' ]; then \ 125 | load_archive "https://github.com/tarantool/nginx_upstream_module/archive/v${TARANTOOL_UPSTREAM_VERSION}.tar.gz"; \ 126 | : "-- msgpuck: build"; \ 127 | load_archive "https://github.com/rtsisyk/msgpuck/archive/${MSGPUCK_VERSION}.tar.gz"; \ 128 | cd /tmp/msgpuck-${MSGPUCK_VERSION}; \ 129 | sed -i "s/if (NOT \${PROJECT_SOURCE_DIR}.*)/if (TRUE)/" CMakeLists.txt; \ 130 | cmake -DCMAKE_BUILD_TYPE=Release .; \ 131 | make msgpuck; \ 132 | : "-- Nginx: setup compiler flags for Tarantool upstream module"; \ 133 | MSGPUCK_DIR=/tmp/msgpuck-${MSGPUCK_VERSION}; \ 134 | NGINX_EXTRA_CCFLAGS="-I${MSGPUCK_DIR} ${NGINX_EXTRA_CCFLAGS:-}"; \ 135 | NGINX_EXTRA_LDFLAGS="-L${MSGPUCK_DIR} ${NGINX_EXTRA_LDFLAGS:-}"; \ 136 | fi; \ 137 | : "-- Nginx: download source"; \ 138 | load_archive "https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz"; \ 139 | : "-- Nginx: build"; \ 140 | cd /tmp/nginx-${NGINX_VERSION}; \ 141 | ./configure \ 142 | --prefix=${NGINX_CONFIG} \ 143 | --conf-path="${NGINX_CONFIG}/nginx.conf" \ 144 | --sbin-path="/usr/local/bin/nginx" \ 145 | --modules-path="/usr/local/lib/nginx/modules" \ 146 | --pid-path="/var/run/nginx/nginx.pid" \ 147 | --lock-path="/var/run/nginx/nginx.lock" \ 148 | --error-log-path="/var/log/nginx/error.log" \ 149 | --http-log-path="/var/log/nginx/access.log" \ 150 | --http-proxy-temp-path="/var/cache/nginx/proxy_temp" \ 151 | --http-client-body-temp-path="/var/cache/nginx/client_temp" \ 152 | --http-fastcgi-temp-path="/var/cache/nginx/fastcgi_temp" \ 153 | --http-uwsgi-temp-path="/var/cache/nginx/uwsgi_temp" \ 154 | --http-scgi-temp-path="/var/cache/nginx/scgi_temp" \ 155 | --user="nginx" \ 156 | --group="nginx" \ 157 | --without-http_auth_basic_module \ 158 | --without-http_autoindex_module \ 159 | --without-http_empty_gif_module \ 160 | --without-http_geo_module \ 161 | --without-http_grpc_module \ 162 | --without-http_memcached_module \ 163 | --without-http_scgi_module \ 164 | --without-http_ssi_module \ 165 | --without-http_uwsgi_module \ 166 | --without-mail_imap_module \ 167 | --without-mail_pop3_module \ 168 | --without-mail_smtp_module \ 169 | --with-http_realip_module \ 170 | --with-pcre \ 171 | --with-pcre-jit \ 172 | --with-threads \ 173 | --with-file-aio \ 174 | --with-cc-opt="-D FD_SETSIZE=$(ulimit -n) ${NGINX_EXTRA_CCFLAGS:-}" \ 175 | --with-ld-opt="${NGINX_EXTRA_LDFLAGS:-}" \ 176 | $(if_yes ${HTTP_STREAM} \ 177 | --with-stream \ 178 | $(if_yes ${HTTP_STREAM_SSL} --with-stream_ssl_module) \ 179 | ) \ 180 | $(if_no ${HTTP_GZIP} --without-http_gzip_module) \ 181 | $(if_no ${HTTP_REFERER} --without-http_referer_module) \ 182 | $(if_no ${HTTP_SPLIT_CLIENTS} --without-http_split_clients_module) \ 183 | $(if_yes ${HTTP_V2} --with-http_v2_module) \ 184 | $(if_yes ${HTTP_SSL} --with-http_ssl_module) \ 185 | $(if_yes ${HTTP_GUNZIP} --with-http_gunzip_module) \ 186 | $(if_yes ${HTTP_GZIP_STATIC} --with-http_gzip_static_module) \ 187 | $(if_yes ${HTTP_DEGRADATION} --with-http_degradation_module) \ 188 | $(if_yes ${HTTP_SECURE_LINK} --with-http_secure_link_module) \ 189 | $(if_yes ${HTTP_SLICE} --with-http_slice_module) \ 190 | $(if_yes ${BROTLI} --add-module="/tmp/ngx_brotli-${BROTLI_VERSION}") \ 191 | $(if_yes ${HEADERS_MORE} --add-module="/tmp/headers-more-nginx-module-${HEADERS_MORE_VERSION}") \ 192 | $(if_yes ${NJS} --add-module="/tmp/njs-${NJS_VERSION}/nginx") \ 193 | $(if_yes ${TARANTOOL_UPSTREAM} --add-module="/tmp/nginx_upstream_module-${TARANTOOL_UPSTREAM_VERSION}") \ 194 | $(if_yes ${LUA} \ 195 | --add-module="/tmp/ngx_devel_kit-${DEVEL_KIT_VERSION}" \ 196 | --add-module="/tmp/lua-nginx-module-${LUA_VERSION}" \ 197 | --add-module="/tmp/stream-lua-nginx-module-${LUA_STREAM_VERSION}" \ 198 | ); \ 199 | make build; \ 200 | make install; \ 201 | \ 202 | if [ ${OUT_STRIP} = 'YES' ]; then \ 203 | : "-- Out: strip executables"; \ 204 | find /usr/local -type f -executable \ 205 | -exec strip --strip-unneeded '{}' + || true; \ 206 | fi; \ 207 | \ 208 | runtime_deps=$(get_deps /usr/local/bin /usr/local/lib | sed -rn "s/\/usr\/lib\/(.*)/so:\1/p"); \ 209 | apk add --no-cache --virtual .nginx-runtime ${runtime_deps}; \ 210 | \ 211 | : "-- Remove build dependencies, clean temporary files"; \ 212 | apk del --no-network .nginx-build; \ 213 | rm -rf /tmp/* /var/tmp/* 214 | 215 | STOPSIGNAL SIGQUIT 216 | 217 | CMD ["nginx"] 218 | -------------------------------------------------------------------------------- /alpine-v8/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.15 2 | 3 | LABEL repository.hub="alexmasterov/alpine-v8" \ 4 | repository.url="https://github.com/AlexMasterov/dockerfiles" \ 5 | maintainer="Alex Masterov " 6 | 7 | # >= 6.1.211 | 6.1 | dev | beta | stable | latest 8 | ARG V8_VERSION=stable 9 | 10 | ARG V8_SHELL=NO 11 | ARG V8_MONOLITHIC=NO 12 | ARG V8_STATIC_LIB=NO 13 | ARG V8_SHARED_LIB=YES 14 | 15 | ARG V8_DEBUG=NO 16 | ARG V8_DEBUG_OPT=NO 17 | ARG V8_SYMBOL_LEVEL=0 18 | 19 | ARG V8_INTL=NO 20 | ARG V8_SIPHASH=NO 21 | ARG V8_OBJECT_PRINT=NO 22 | ARG V8_DISASSEMBLER=NO 23 | ARG V8_POINTER_COMPRESSION=YES 24 | ARG V8_EXTERNAL_STARTUP_DATA=NO 25 | ARG V8_31BIT_SMIS_ON_64BIT_ARCH=YES 26 | ARG V8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 27 | 28 | ARG NUM_JOBS 29 | ARG SYMBOL_LEVEL=0 30 | 31 | ARG USE_CLANG=YES 32 | ARG USE_LLD=YES 33 | ARG USE_LLD_THIN_LTO=NO 34 | ARG USE_LLD_THIN_LTO_OPT=NO 35 | ARG LLD_THIN_LTO_JOBS 36 | # GNU libc backtrace facility 37 | ARG USE_EXECINFO=NO 38 | 39 | ARG USE_GN_SOURCE=NO 40 | ARG GN_SOURCE_REV 41 | ARG GN_EXTRA_ARGS 42 | 43 | ARG OUT_LIBCXX=NO 44 | ARG OUT_HEADERS=YES 45 | ARG OUT_STRIP=YES 46 | 47 | ENV V8_VERSION=${V8_VERSION} \ 48 | V8_PATH=/usr/local/v8 49 | 50 | RUN set -eux; \ 51 | as_ver() { set -- ${1//./ }; local y="00${2:-0}" z="00${3:-0}" w="00${4:-0}"; echo "${1}${y:(-3)}${z:(-3)}${w:(-3)}"; }; \ 52 | compare_ver() { test $(as_ver ${1}) -${2} $(as_ver ${3}); }; \ 53 | contains() { if [ -z "${1##*${2}*}" ]; then shift 2; echo ${*:-}; fi; }; \ 54 | get_deps() { find ${*:-} -type f -and \( -executable -or -name '*.so*' \) -exec ldd '{}' ';' | sed -rn "s/\s*(.* => )?(.*) \(.*/\2/p" | sort -u; }; \ 55 | if_no() { if [ ${1} = 'NO' ]; then shift 1; echo ${*:-}; fi; }; \ 56 | if_v8_ver() { if compare_ver ${V8_VERSION} ${1} ${2}; then shift 2; echo ${*:-}; fi; }; \ 57 | if_yes() { if [ ${1} = 'YES' ]; then shift 1; echo ${*:-}; fi; }; \ 58 | load_archive() { [ -d ${2} ] || mkdir -p ${2}; wget ${1} -T 30 -O - | tar xmz -C ${2}; }; \ 59 | to_bool() { if [ ${1} = 'YES' ]; then echo true; else echo false; fi; }; \ 60 | \ 61 | if [ "${V8_VERSION//[^.]}" = '.' ]; then \ 62 | v8_version_url="https://raw.githubusercontent.com/v8/v8/${V8_VERSION}-lkgr/include/v8-version.h"; \ 63 | v8_build_ver=$(wget "${v8_version_url}" -T 30 -O - | sed -rn "/#.*V8_BUILD_NUMBER/N;s/#.*_NUMBER (\d+).*_LEVEL (\d+)/\1.\2/p"); \ 64 | V8_VERSION=${v8_build_ver:+${V8_VERSION}.${v8_build_ver//.0}}; \ 65 | V8_VERSION=${V8_VERSION:-latest}; \ 66 | fi; \ 67 | if test $(contains "dev beta stable latest" ${V8_VERSION} 1); then \ 68 | if [ ${V8_VERSION} = 'latest' ]; then \ 69 | v8_version_url="https://storage.googleapis.com/chromium-v8/official/canary/v8-linux64-rel-latest.json"; \ 70 | v8_version_regexp=".*\"version\":\s*?\"(.*\d+)\".*"; \ 71 | else \ 72 | v8_version_url="https://omahaproxy.appspot.com/all"; \ 73 | v8_version_regexp="linux,${V8_VERSION}.*,(.*)$"; \ 74 | fi; \ 75 | \ 76 | V8_VERSION=$(wget ${v8_version_url} -T 30 -O - | sed -rn "s/${v8_version_regexp}/\1/p"); \ 77 | fi; \ 78 | \ 79 | case $(uname -m) in \ 80 | x86_64) ARCH="x64" ;; \ 81 | x86) ARCH="x86" ;; \ 82 | armhf|armv7) ARCH="arm" ;; \ 83 | aarch64) ARCH="arm64" ;; \ 84 | esac; \ 85 | \ 86 | NUM_JOBS=${NUM_JOBS:-$(getconf _NPROCESSORS_ONLN)}; \ 87 | SOURCE_REPO="https://chromium.googlesource.com"; \ 88 | V8_SOURCE=/tmp/v8; \ 89 | V8_DEPS=${V8_SOURCE}/DEPS; \ 90 | PY_VER=$(if_v8_ver ge 7.9 3); PY_VER=${PY_VER:-2}; \ 91 | \ 92 | echo "https://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories; \ 93 | apk add --no-cache --virtual .v8-build \ 94 | g++ \ 95 | linux-headers \ 96 | python${PY_VER} \ 97 | samurai \ 98 | $(if_yes ${USE_CLANG} \ 99 | clang=~12 \ 100 | llvm12=~12 \ 101 | ) \ 102 | $(if_no ${USE_CLANG} gcc) \ 103 | $(if_yes ${USE_LLD} lld=~12) \ 104 | $(if_yes ${USE_GN_SOURCE} clang=~12) \ 105 | $(if_no ${USE_GN_SOURCE} gn) \ 106 | $(if_yes ${USE_EXECINFO} libexecinfo-dev) \ 107 | $(if_yes ${V8_INTL} icu-dev=~69) \ 108 | ; \ 109 | : "-- V8: download source"; \ 110 | load_archive "${SOURCE_REPO}/v8/v8/+archive/${V8_VERSION}.tar.gz" ${V8_SOURCE}; \ 111 | : "-- V8: download deps."; \ 112 | deps=" \ 113 | base/trace_event/common \ 114 | build \ 115 | buildtools \ 116 | $(if_yes ${V8_INTL} third_party/icu) \ 117 | $(if_yes ${V8_SHELL} \ 118 | third_party/jinja2 \ 119 | third_party/markupsafe \ 120 | ) \ 121 | $(if_v8_ver le 6.7.148 testing/gtest) \ 122 | $(if_v8_ver ge 6.7.149 third_party/googletest/src) \ 123 | $(if_v8_ver ge 8.0.365 third_party/zlib) \ 124 | $(if_v8_ver le 9.6.130 $(if_v8_ver ge 9.6.53 \ 125 | third_party/abseil-cpp \ 126 | )) \ 127 | "; \ 128 | for dep in ${deps}; do { \ 129 | target="${dep//\//\\/}"; \ 130 | target="${target//+/\\+}"; \ 131 | repo=$(sed -rn "/['\"].*${target}['\"]:/{;:a;N/\.git/!ba;s/.*['\"](.*)\.git['\"].*/\1/p}" ${V8_DEPS}); \ 132 | rev=$(sed -rn "/['\"].*${target}['\"]:/{;:a;N/@/!ba;s/.*['\"](.*)['\"].*/\1/p}" ${V8_DEPS}); \ 133 | \ 134 | load_archive "${SOURCE_REPO}${repo}/+archive/${rev}.tar.gz" ${V8_SOURCE}/${dep}; \ 135 | } & \ 136 | done; \ 137 | wait; \ 138 | \ 139 | if [ ${USE_GN_SOURCE} = 'YES' ]; then \ 140 | GN_SOURCE=/tmp/gn; \ 141 | gn_rev=${GN_SOURCE_REV:-$(cat ${V8_SOURCE}/buildtools/linux64/gn.sha1 || true)}; \ 142 | gn_rev=${gn_rev:-$(sed -rn "/['\"]gn_version['\"]:\s*/{N;s/.*['\"]git_revision:(.*)['\"],?\s*?/\1/p}" ${V8_DEPS})}; \ 143 | gn_rev=${gn_rev:?GN_SOURCE_REV is required}; \ 144 | : "-- GN SOURCE: download source"; \ 145 | load_archive "https://gn.googlesource.com/gn/+archive/${gn_rev}.tar.gz" ${GN_SOURCE}; \ 146 | : "-- GN SOURCE: stop regen config and speed up build"; \ 147 | sed -ri \ 148 | -e "s/(generator\s*=).*',/\1 0'/" \ 149 | -e "/executables\['gn_unittests'\]/d" \ 150 | -e "s/[^def] WriteGenericNinja/ del executables['gn_unittests']\n\n&/" \ 151 | ${GN_SOURCE}/build/gen.py; \ 152 | : "-- GN SOURCE: build"; \ 153 | python${PY_VER} ${GN_SOURCE}/build/gen.py \ 154 | --host=linux \ 155 | --platform=linux \ 156 | --no-last-commit-position \ 157 | $(if_v8_ver ge 7.9.35 --no-static-libstdc++); \ 158 | echo -e "\ 159 | \n#ifndef OUT_LAST_COMMIT_POSITION_H_ \ 160 | \n#define OUT_LAST_COMMIT_POSITION_H_ \ 161 | \n#define LAST_COMMIT_POSITION_NUM 0 \ 162 | \n#define LAST_COMMIT_POSITION \"${gn_rev::8}\" \ 163 | \n#endif \ 164 | " > ${GN_SOURCE}/out/last_commit_position.h; \ 165 | ninja \ 166 | -C ${GN_SOURCE}/out \ 167 | -j ${NUM_JOBS}; \ 168 | ln -fs ${GN_SOURCE}/out/gn /usr/bin/gn; \ 169 | fi; \ 170 | \ 171 | cd ${V8_SOURCE}; \ 172 | : "-- Patch: build"; \ 173 | sed -ri \ 174 | -e "$(if_no ${V8_SHELL} "s/\"(src|test)\/inspector:.*\",?//")" \ 175 | -e "s/\"(tools|test):gn_all\",?//" \ 176 | -e "s/\"test\/(cctest|unittests):.*\",?//" \ 177 | -e "s/\"\/\/build\/(win:default_exe_manifest|config:exe_and_shlib_deps)\",?//" \ 178 | BUILD.gn; \ 179 | if compare_ver ${V8_VERSION} le 6.7.197; then \ 180 | sed -ri "s/\"\/\/test\/test262\/BUILD.gn\",?//" .gn; \ 181 | fi; \ 182 | if [ ${V8_INTL} = 'NO' ] && compare_ver ${V8_VERSION} le 6.7.196; then \ 183 | sed -i "s/import(\"\/\/third_party\/icu\/config.gni\")/icu_use_data_file = false/" gni/isolate.gni; \ 184 | fi; \ 185 | if compare_ver ${V8_VERSION} le 7.1.165 && compare_ver ${V8_VERSION} ge 7.1.79; then \ 186 | sed -i "/import(\"\/\/third_party\/catapult\/devil\/devil_arm\.gni\")/d" build/config/arm.gni; \ 187 | fi; \ 188 | if compare_ver ${V8_VERSION} le 7.2.505 && compare_ver ${V8_VERSION} ge 7.1.78; then \ 189 | sed -i "s/if (use_atk)/if (false)/" build/config/linux/BUILD.gn; \ 190 | fi; \ 191 | if compare_ver ${V8_VERSION} ge 8.6.51; then \ 192 | echo "checkout_google_benchmark = false" >> build/config/gclient_args.gni; \ 193 | fi; \ 194 | if compare_ver ${V8_VERSION} le 8.7.209; then \ 195 | sed -ri "s/(set_sources_assignment_filter)\(.*\)/\1([])/" build/config/BUILDCONFIG.gn; \ 196 | fi; \ 197 | if [ ${ARCH} = 'arm' ]; then \ 198 | sed -ri "s/\"(--target)=arm-.*\"/\"\1=$(g++ -dumpmachine)\"/" build/config/compiler/BUILD.gn; \ 199 | fi; \ 200 | if [ ${ARCH} = 'arm64' ]; then \ 201 | dumpmachine=$(g++ -dumpmachine); \ 202 | sed -ri "s/\"(--target)=aarch64-.*\"/\"\1=${dumpmachine}\"/" build/config/compiler/BUILD.gn; \ 203 | sed -ri "s/(toolprefix) = \"aarch64-.*\"/\1 = \"\/usr\/${dumpmachine}\/bin\/\"/" build/toolchain/linux/BUILD.gn; \ 204 | if ${USE_CLANG} = 'NO' && compare_ver ${V8_VERSION} le 9.3.50; then \ 205 | : "-- GCC build fails trying to use a non constexpr function from a constexpr function"; \ 206 | header=$(if_v8_ver le 7.3.200 assembler-arm64.h); \ 207 | sed -ri "s/VRegister from_code/constexpr &/" src/$(if_v8_ver ge 7.6.234 codegen/)arm64/${header:-register-arm64.h}; \ 208 | fi; \ 209 | fi; \ 210 | \ 211 | : "-- Patch: compiler"; \ 212 | if [ ${USE_CLANG} = 'NO' ]; then \ 213 | if test $(contains ${ARCH} 'arm' 1) && compare_ver ${V8_VERSION} ge 8.0.365; then \ 214 | sed -ri "s/if \(arm_use_neon/& \&\& is_clang/" third_party/zlib/BUILD.gn; \ 215 | fi; \ 216 | if compare_ver ${V8_VERSION} le 8.9.2; then \ 217 | : "-- Patch: V8 is not -fsanitize=null clean (issue 3782)"; \ 218 | sed -ri "s/(cflags)\s*=\s*\[(.*)\]/\1 = [\"-fno-delete-null-pointer-checks\", \2]/" BUILD.gn; \ 219 | fi; \ 220 | : "-- Patch: don't use the attribute [[nodiscard]]"; \ 221 | sed -ri "s/(define V8_HAS_CPP_ATTRIBUTE_NODISCARD).*/\1 0/g" include/v8config.h; \ 222 | fi; \ 223 | if [ ${USE_CLANG} = 'YES' ]; then \ 224 | sed -ri \ 225 | -e "$(if_v8_ver le 6.6.164 "/(update_args|(\":|\\$|\s+)clang_revision)/{/.*/d}")" \ 226 | -e "$(if_v8_ver ge 9.3.72 "s/\"-Wno-unused-but-set-(variable|parameter)\",?//")" \ 227 | -e "$(if_v8_ver ge 9.4.22 "s/\"(-Wa,)?-f(debug|file)-compilation-dir(.|=).*\",?//")" \ 228 | build/config/compiler/BUILD.gn; \ 229 | fi; \ 230 | if [ "${USE_LLD}${USE_LLD_THIN_LTO}" = 'YESYES' ]; then \ 231 | sed -ri \ 232 | -e "/cache_policy =.*\"/d" \ 233 | -e "/\/lldltocache(policy)?:/{;:a;N/,/!ba;s/.*,//}" \ 234 | -e "s/(thinlto-jobs=).*(\",?)/\1${USE_LLD_THIN_LTO_JOBS:-${NUM_JOBS}}\2/" \ 235 | build/config/compiler/BUILD.gn; \ 236 | fi; \ 237 | \ 238 | : "-- Patch: V8"; \ 239 | if test $(contains ${ARCH} 'arm' 1); then \ 240 | sed -i "s/\(V8_HOST_ARCH\)_PPC || V8_HOST_ARCH_PPC64/& || \1_ARM || \1_ARM64/" src/base/cpu.cc; \ 241 | fi; \ 242 | if compare_ver ${V8_VERSION} le 7.4.221; then \ 243 | : "-- Patch: fix deadlock in OptimizingCompileDispatcher (issue 935358)"; \ 244 | sed -ri "/.*access_output_queue_.*;\s*/{N;s/(.*output_queue_\.push.*)/{\n\1\n}/}" \ 245 | src/compiler-dispatcher/optimizing-compile-dispatcher.cc; \ 246 | fi; \ 247 | : "-- Patch: use monotonic clock for 'pthread_cond_timedwait' with musl"; \ 248 | sed -ri "s/\((V8_OS_LINUX).*[^=\)]\)?/\1/g" src/base/platform/condition-variable.cc; \ 249 | : "-- Patch: fix undefined symbol: backtrace_symbols (execinfo.h)"; \ 250 | if [ ${USE_EXECINFO} = 'YES' ]; then \ 251 | sed -ri "/config\(\"libbase_config\"\)/{;:a;N;/libs/!ba;s/(libs) = \[(.*)\]/\1 = \[\"execinfo\", \2\]/}" BUILD.gn; \ 252 | sed -ri \ 253 | -e "s/^(#if) V8_LIBC_GLIBC.*/\1 V8_OS_LINUX/" \ 254 | -e "s/(count_) = .*backtrace\(.*;/\1 = 0;/" \ 255 | src/base/debug/stack_trace_posix.cc; \ 256 | else \ 257 | sed -ri \ 258 | -e "s/^(#if) V8_LIBC_GLIBC.*/\1 0/" \ 259 | -e "/const char k(MangledSymbolPrefix|SymbolCharacters)/{N;/;/d}" \ 260 | src/base/debug/stack_trace_posix.cc; \ 261 | sed -ri \ 262 | -e "/^#include s*/d" \ 263 | -e "s/^#ifdef SYMBOLIZE_FUNCTION.*/#if 0/" \ 264 | src/$(if_v8_ver ge 7.6.234 codegen/)external-reference-table.cc; \ 265 | fi; \ 266 | : "-- GN: generate instructions"; \ 267 | gn gen out \ 268 | --script-executable=python${PY_VER} \ 269 | --args=" \ 270 | target_cpu=\"${ARCH}\" \ 271 | target_os=\"linux\" \ 272 | symbol_level=${SYMBOL_LEVEL:-1} \ 273 | \ 274 | is_cfi=false \ 275 | is_clang=$(to_bool ${USE_CLANG}) \ 276 | $(if_yes ${USE_CLANG} \ 277 | clang_base_path=\"/usr\" \ 278 | clang_use_chrome_plugins=false \ 279 | ) \ 280 | use_sysroot=false \ 281 | use_custom_libcxx=false \ 282 | use_custom_libcxx_for_host=false \ 283 | use_glib=false \ 284 | use_gold=false \ 285 | use_lld=$(to_bool ${USE_LLD}) \ 286 | $(if_yes ${USE_LLD} \ 287 | use_thin_lto=$(to_bool ${USE_LLD_THIN_LTO}) \ 288 | thin_lto_enable_optimizations=$(to_bool ${USE_LLD_THIN_LTO_OPT}) \ 289 | ) \ 290 | fatal_linker_warnings=false \ 291 | treat_warnings_as_errors=false \ 292 | \ 293 | v8_target_cpu=\"${ARCH}\" \ 294 | is_debug=$(to_bool ${V8_DEBUG}) \ 295 | $(if_yes ${V8_DEBUG} v8_optimized_debug=$(to_bool ${V8_DEBUG_OPT})) \ 296 | $(if_no ${V8_DEBUG} v8_enable_disassembler=$(to_bool ${V8_DISASSEMBLER})) \ 297 | v8_symbol_level=${V8_SYMBOL_LEVEL:-1} \ 298 | \ 299 | v8_static_library=$(to_bool ${V8_STATIC_LIB}) \ 300 | $(if_yes ${V8_MONOLITHIC} \ 301 | is_component_build=false \ 302 | v8_monolithic=true \ 303 | v8_use_external_startup_data=false \ 304 | ) \ 305 | $(if_no ${V8_MONOLITHIC} \ 306 | is_component_build=$(to_bool ${V8_SHARED_LIB}) \ 307 | v8_use_external_startup_data=$(to_bool ${V8_EXTERNAL_STARTUP_DATA}) \ 308 | ) \ 309 | \ 310 | v8_use_siphash=$(to_bool ${V8_SIPHASH}) \ 311 | v8_win64_unwinding_info=false \ 312 | v8_enable_backtrace=true \ 313 | v8_enable_gdbjit=false \ 314 | v8_enable_vtunejit=false \ 315 | v8_enable_vtunetracemark=false \ 316 | v8_enable_handle_zapping=false \ 317 | v8_enable_google_benchmark=false \ 318 | v8_enable_i18n_support=$(to_bool ${V8_INTL}) \ 319 | v8_enable_object_print=$(to_bool ${V8_OBJECT_PRINT}) \ 320 | v8_typed_array_max_size_in_heap=${V8_TYPED_ARRAY_MAX_SIZE_IN_HEAP:-64} \ 321 | $(contains ${ARCH} '64' \ 322 | v8_enable_pointer_compression=$(to_bool ${V8_POINTER_COMPRESSION}) \ 323 | v8_enable_31bit_smis_on_64bit_arch=$(to_bool ${V8_31BIT_SMIS_ON_64BIT_ARCH}) \ 324 | ) \ 325 | ${GN_EXTRA_ARGS:-} \ 326 | "; \ 327 | : "-- Ninja: build V8"; \ 328 | ninja \ 329 | -C ${V8_SOURCE}/out \ 330 | -j ${NUM_JOBS} \ 331 | $(if_yes ${V8_SHELL} d8) \ 332 | $(if_yes ${V8_MONOLITHIC} v8_monolith) \ 333 | $(if_no ${V8_MONOLITHIC} \ 334 | $(if_yes ${V8_SHARED_LIB} v8) \ 335 | ); \ 336 | \ 337 | mkdir -p ${V8_PATH}; \ 338 | if [ ${OUT_HEADERS} = 'YES' ]; then \ 339 | : "-- Out: V8 headers"; \ 340 | find ${V8_SOURCE}/include/ -depth \( -type f -not -name '*.h' -or -type d -empty \) -delete; \ 341 | chmod -R 644 ${V8_SOURCE}/include/; \ 342 | mv include ${V8_PATH}; \ 343 | fi; \ 344 | if [[ ${V8_STATIC_LIB} = 'YES' || ${V8_MONOLITHIC} = 'YES' ]]; then \ 345 | : "-- Out: V8 static libraries"; \ 346 | find ${V8_SOURCE}/out/obj/ -depth \( -type f -not -name '*.a' -or -type d -empty \) -delete; \ 347 | chmod -R 755 ${V8_SOURCE}/out/obj/; \ 348 | mv ${V8_SOURCE}/out/obj ${V8_PATH}; \ 349 | fi; \ 350 | if [[ ${V8_SHARED_LIB} = 'YES' && ${V8_MONOLITHIC} = 'NO' ]]; then \ 351 | : "-- Out: V8 shared libraries"; \ 352 | mkdir -p ${V8_PATH}/lib; \ 353 | find ${V8_SOURCE}/out/ -maxdepth 1 -type f -regex '.*.\(so\|bin\|dat\)' \ 354 | -exec mv '{}' ${V8_PATH}/lib +; \ 355 | \ 356 | if [ ${OUT_LIBCXX} = 'YES' ]; then \ 357 | : "-- Out: C++ shared libraries"; \ 358 | out_libs=$(get_deps ${V8_PATH}/lib | sed -rn "s/^\/usr\/lib\//&/p"); \ 359 | cp --dereference ${out_libs} ${V8_PATH}/lib; \ 360 | fi; \ 361 | \ 362 | chmod -R 755 ${V8_PATH}/lib/; \ 363 | ln -fs ${V8_PATH}/lib/*.so* /usr/local/lib; \ 364 | fi; \ 365 | if [ ${V8_SHELL} = 'YES' ]; then \ 366 | : "-- Out: V8 executables"; \ 367 | mkdir -p ${V8_PATH}/bin; \ 368 | mv ${V8_SOURCE}/out/d8 ${V8_PATH}/bin/d8; \ 369 | ln -fs ${V8_PATH}/bin/d8 /usr/local/bin/d8; \ 370 | \ 371 | if [[ ${V8_SHARED_LIB} = 'NO' || "${V8_SHARED_LIB}${OUT_LIBCXX}" = 'YESNO' ]]; then \ 372 | d8_std_libs=$(get_deps ${V8_PATH}/bin/d8 | sed -rn "s/\/usr\/lib\/(.*)/so:\1/p"); \ 373 | apk add --no-cache --virtual .d8-runtime ${d8_std_libs}; \ 374 | fi; \ 375 | fi; \ 376 | if [ ${OUT_STRIP} = 'YES' ]; then \ 377 | : "-- Out: strip executables"; \ 378 | find ${V8_PATH} -type f -executable -not -name '*.a' \ 379 | -exec strip --strip-unneeded '{}' + || true; \ 380 | fi; \ 381 | \ 382 | : "-- Remove build dependencies, clean temporary files"; \ 383 | apk del --no-network .v8-build; \ 384 | rm -rf /tmp/* /var/tmp/* 385 | 386 | WORKDIR ${V8_PATH} 387 | -------------------------------------------------------------------------------- /alpine-php/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.15 2 | 3 | LABEL repository.hub="alexmasterov/alpine-php" \ 4 | repository.url="https://github.com/AlexMasterov/dockerfiles" \ 5 | maintainer="Alex Masterov " 6 | 7 | # >= 7.0.0 | 7.0 8 | ARG PHP_VERSION=8.1 9 | 10 | ARG PHP_CONFIG=/etc/php 11 | ARG PHP_CFLAGS="-O2 -fPIC -fpie -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" 12 | ARG PHP_LDFLAGS="-Wl,-O1 -Wl,--hash-style=both -pie" 13 | 14 | ARG PHP_CLI=YES 15 | ARG PHP_FPM=NO 16 | ARG PHP_IPV6=NO 17 | 18 | ARG EXT_BCMATH=NO 19 | ARG EXT_BZ2=NO 20 | ARG EXT_CTYPE=YES 21 | ARG EXT_CURL=YES 22 | ARG EXT_DOM=NO 23 | ARG EXT_FILEINFO=NO 24 | ARG EXT_FILTER=YES 25 | ARG EXT_FTP=NO 26 | ARG EXT_GD=NO 27 | ARG EXT_GD_BUNDLED=YES 28 | ARG EXT_GD_FREETYPE=YES 29 | ARG EXT_GD_JPEG=YES 30 | ARG EXT_GD_WEBP=YES 31 | ARG EXT_GD_XPM=YES 32 | ARG EXT_GMP=NO 33 | ARG EXT_INTL=NO 34 | ARG EXT_MBSTRING=YES 35 | ARG EXT_MBSTRING_REGEX=YES 36 | ARG EXT_OPENSSL=YES 37 | ARG EXT_OPENSSL_SYSTEM_CIPHERS=YES 38 | ARG EXT_PCNTL=NO 39 | ARG EXT_PCRE_BUNDLED=NO 40 | ARG EXT_PDO_MYSQL=NO 41 | ARG EXT_PDO_MYSQL_BUNDLED=NO 42 | ARG EXT_PDO_PGSQL=NO 43 | ARG EXT_PDO_SQLITE=YES 44 | ARG EXT_PHAR=NO 45 | ARG EXT_POSIX=NO 46 | ARG EXT_POSTGRESQL=NO 47 | ARG EXT_READLINE=NO 48 | ARG EXT_SIMPLEXML=YES 49 | ARG EXT_SQLITE3=NO 50 | ARG EXT_TOKENIZER=YES 51 | ARG EXT_XML=NO 52 | ARG EXT_XMLREADER=NO 53 | ARG EXT_XMLWRITER=NO 54 | ARG EXT_XSL=NO 55 | ARG EXT_ZIP=NO 56 | ARG EXT_ZIP_BUNDLED=NO 57 | ARG EXT_ZLIB=NO 58 | 59 | # < 7.4.0 60 | ARG EXT_MBSTRING_REGEX_BUNDLED=NO 61 | # >= 7.2.0 62 | ARG PHP_ARGON2=YES 63 | ARG EXT_SODIUM=YES 64 | # >= 8.0.0 65 | ARG EXT_FFI=NO 66 | ARG EXT_OPCACHE_JIT=YES 67 | # >= 8.1.0 68 | ARG EXT_GD_AVIF=NO 69 | 70 | ARG EXT_XDEBUG=NO 71 | ARG EXT_XDEBUG_VERSION=3.1.3 72 | 73 | ARG EXT_APCU=NO 74 | ARG EXT_APCU_VERSION=5.1.21 75 | ARG EXT_APCU_RWLOCKS=YES 76 | ARG EXT_APCU_SPINLOCKS=NO 77 | 78 | ARG EXT_MSGPACK=NO 79 | ARG EXT_MSGPACK_VERSION=2.2.0RC1 80 | 81 | ARG EXT_PHPREDIS=NO 82 | ARG EXT_PHPREDIS_VERSION=5.3.7RC1 83 | ARG EXT_PHPREDIS_SESSION=YES 84 | ARG EXT_PHPREDIS_JSON=YES 85 | ARG EXT_PHPREDIS_MSGPACK=NO 86 | ARG EXT_PHPREDIS_LZ4=NO 87 | ARG EXT_PHPREDIS_ZSTD=NO 88 | 89 | ARG EXT_MEMCACHED=NO 90 | ARG EXT_MEMCACHED_VERSION=3.1.5 91 | ARG EXT_MEMCACHED_SESSION=YES 92 | ARG EXT_MEMCACHED_JSON=YES 93 | ARG EXT_MEMCACHED_MSGPACK=NO 94 | 95 | ARG EXT_MONGODB=NO 96 | ARG EXT_MONGODB_VERSION=1.12.0 97 | ARG EXT_MONGODB_TLS=YES 98 | 99 | ARG EXT_AMQP=NO 100 | ARG EXT_AMQP_VERSION=1.11.0 101 | 102 | ARG USE_TZ=NO 103 | ARG LIB_SSL=OPENSSL 104 | 105 | ARG OUT_STRIP=YES 106 | 107 | RUN set -eux; \ 108 | lib_ssl=$(echo ${LIB_SSL:-} | tr '[:upper:]' '[:lower:]'); \ 109 | \ 110 | if [ "${PHP_VERSION//[^.]}" = '.' ]; then \ 111 | PHP_VERSION=$(wget "https://php.net/releases/index.php?json&version=${PHP_VERSION}" -T 30 -O - | sed -rn "s/.*\"version\":\s*?\"(.*\d+)\".*/\1/p"); \ 112 | PHP_VERSION=${PHP_VERSION:?"Unknown PHP version: ${PHP_VERSION}"}; \ 113 | fi; \ 114 | \ 115 | as_ver() { set -- ${1//./ }; local y="00${2:-0}" z="00${3:-0}"; echo "${1}${y:(-3)}${z:(-3)}"; }; \ 116 | compare_ver() { test $(as_ver ${1}) -${2} $(as_ver ${3}); }; \ 117 | contains() { if [ -z ${1##*${2}*} ]; then shift 2; echo ${*:-}; fi; }; \ 118 | get_deps() { find ${*:-} -type f -and \( -executable -or -name '*.so*' \) -exec ldd '{}' ';' | sed -rn "s/\s*(.* => )?(.*) \(.*/\2/p" | sort -u; }; \ 119 | if_eq() { if [ ${1} = ${2} ]; then shift 2; echo ${*:-}; fi; }; \ 120 | if_no() { if [ ${1} = 'NO' ]; then shift 1; echo ${*:-}; fi; }; \ 121 | if_php_ver() { if compare_ver ${PHP_VERSION} ${1} ${2}; then shift 2; echo ${*:-}; fi; }; \ 122 | if_yes() { if [ ${1} = 'YES' ]; then shift 1; echo ${*:-}; fi; }; \ 123 | load_archive() { wget ${1} -T 30 -O - | tar ${2:-xmz} -C /tmp; }; \ 124 | make_ext() { phpize; ./configure --build=$(g++ -dumpmachine) ${*:-}; make; make install; }; \ 125 | \ 126 | apk add --no-cache --virtual .php-build \ 127 | autoconf \ 128 | bison \ 129 | file \ 130 | g++ \ 131 | gcc \ 132 | gnu-libiconv-dev \ 133 | make \ 134 | re2c \ 135 | $(if_php_ver ge 7.1.17 \ 136 | $(if_yes ${EXT_INTL} icu-dev) \ 137 | ) \ 138 | $(if_php_ver ge 7.2.0 \ 139 | $(if_yes ${PHP_ARGON2} argon2-dev) \ 140 | $(if_yes ${EXT_SODIUM} libsodium-dev) \ 141 | ) \ 142 | $(if_php_ver ge 8.0.0 \ 143 | $(if_yes ${EXT_FFI} libffi-dev) \ 144 | ) \ 145 | $(if_no ${EXT_PCRE_BUNDLED} pcre$(if_php_ver ge 7.3.0 2)-dev) \ 146 | $(if_yes ${EXT_FFI} libffi-dev) \ 147 | $(if_yes ${EXT_BZ2} bzip2-dev) \ 148 | $(if_yes ${EXT_CURL} curl-dev) \ 149 | $(if_yes ${EXT_READLINE} readline-dev) \ 150 | $(if_yes ${EXT_GMP} gmp-dev) \ 151 | $(if_yes ${EXT_SQLITE3} sqlite-dev) \ 152 | $(if_yes ${EXT_POSTGRESQL} postgresql-dev) \ 153 | $(if_yes ${EXT_OPENSSL} ${lib_ssl}-dev) \ 154 | $(if_yes ${EXT_GD} \ 155 | $(if_php_ver lt 7.4.0 \ 156 | $(if_no ${EXT_GD_BUNDLED} \ 157 | gd-dev \ 158 | jpeg-dev \ 159 | libxpm-dev \ 160 | ) \ 161 | $(if_yes ${EXT_GD_BUNDLED} \ 162 | $(if_yes ${EXT_GD_JPEG} jpeg-dev) \ 163 | $(if_yes ${EXT_GD_XPM} libxpm-dev) \ 164 | ) \ 165 | $(if_yes ${EXT_GD_WEBP} libwebp-dev) \ 166 | $(if_yes ${EXT_GD_FREETYPE} freetype-dev) \ 167 | libpng-dev \ 168 | ) \ 169 | $(if_php_ver ge 7.4.0 \ 170 | $(if_no ${EXT_GD_BUNDLED} gd-dev) \ 171 | $(if_yes ${EXT_GD_BUNDLED} \ 172 | $(if_no ${EXT_GD_JPEG} jpeg-dev) \ 173 | $(if_no ${EXT_GD_XPM} libxpm-dev) \ 174 | $(if_no ${EXT_GD_WEBP} libwebp-dev) \ 175 | $(if_no ${EXT_GD_FREETYPE} freetype-dev) \ 176 | $(if_yes ${EXT_GD_AVIF} libavif-dev) \ 177 | libpng-dev \ 178 | ) \ 179 | ) \ 180 | ) \ 181 | $(contains "${EXT_PDO_SQLITE}${EXT_PDO_PGSQL}${EXT_PDO_MYSQL}" 'YES' \ 182 | $(if_yes ${EXT_PDO_SQLITE} sqlite-dev) \ 183 | $(if_yes ${EXT_PDO_PGSQL} postgresql-dev) \ 184 | $(if_yes ${EXT_PDO_MYSQL} \ 185 | $(if_no ${EXT_PDO_MYSQL_BUNDLED} mariadb-dev) \ 186 | ) \ 187 | ) \ 188 | $(contains "${EXT_DOM}${EXT_SIMPLEXML}${EXT_XML}${EXT_XMLREADER}${EXT_XMLWRITER}${EXT_XSL}" 'YES' \ 189 | $(if_yes ${EXT_XSL} libxslt-dev) \ 190 | libxml2-dev \ 191 | ) \ 192 | $(if_yes ${EXT_ZLIB} zlib-dev) \ 193 | $(if_yes ${EXT_ZIP} \ 194 | $(if_no ${EXT_ZIP_BUNDLED} libzip-dev) \ 195 | zlib-dev \ 196 | ) \ 197 | $(if_yes ${EXT_MBSTRING} \ 198 | $(if_yes ${EXT_MBSTRING_REGEX} \ 199 | $(if_php_ver lt 7.4.0 $(if_no ${EXT_MBSTRING_REGEX_BUNDLED} oniguruma-dev)) \ 200 | $(if_php_ver ge 7.4.0 oniguruma-dev) \ 201 | ) \ 202 | ) \ 203 | \ 204 | $(if_yes ${EXT_AMQP} rabbitmq-c-dev) \ 205 | $(if_yes ${EXT_MEMCACHED} \ 206 | libmemcached-dev \ 207 | zlib-dev \ 208 | ) \ 209 | $(if_yes ${EXT_PHPREDIS} \ 210 | $(if_yes ${EXT_PHPREDIS_LZ4} lz4-dev) \ 211 | $(if_yes ${EXT_PHPREDIS_ZSTD} zstd-dev) \ 212 | ) \ 213 | $(if_yes ${EXT_MONGODB} \ 214 | $(if_yes ${EXT_MONGODB_TLS} ${lib_ssl}-dev) \ 215 | ) \ 216 | ; \ 217 | if compare_ver ${PHP_VERSION} le 7.1.16; then \ 218 | if [ ${EXT_INTL} = 'YES' ]; then \ 219 | apk add --no-cache --virtual .php-build-intl --repository http://dl-cdn.alpinelinux.org/alpine/v3.8/main/ \ 220 | icu-dev=60.2-r3; \ 221 | fi; \ 222 | if [ "${EXT_MBSTRING}${EXT_MBSTRING_REGEX}${EXT_MBSTRING_REGEX_BUNDLED}" = 'YESYESNO' ]; then \ 223 | apk add --no-cache --virtual .php-build-mbregex --repository http://dl-cdn.alpinelinux.org/alpine/v3.7/main/ \ 224 | oniguruma-dev=6.6.1-r0; \ 225 | fi; \ 226 | fi; \ 227 | if [ ${USE_TZ} = 'YES' ]; then \ 228 | apk add --no-cache --virtual .php-tz tzdata; \ 229 | fi; \ 230 | : "-- GNU iconv: replace binary and headers"; \ 231 | mv /usr/bin/gnu-iconv /usr/bin/iconv; \ 232 | mv /usr/include/gnu-libiconv/*.h /usr/include; \ 233 | : "-- make: setup flags"; \ 234 | export MAKEFLAGS="-j $(( $(getconf _NPROCESSORS_ONLN) - 1 ))"; \ 235 | : "-- PHP: download source"; \ 236 | load_archive "https://www.php.net/distributions/php-${PHP_VERSION}.tar.xz" xJ; \ 237 | cd /tmp/php-${PHP_VERSION}; \ 238 | : "-- PHP: build"; \ 239 | ./configure \ 240 | --build=$(g++ -dumpmachine) \ 241 | --datadir=/tmp \ 242 | --datarootdir=/tmp \ 243 | --prefix=/usr/local \ 244 | --sysconfdir=${PHP_CONFIG} \ 245 | --with-config-file-path=${PHP_CONFIG} \ 246 | --with-config-file-scan-dir=${PHP_CONFIG}/conf.d \ 247 | --with-layout=GNU \ 248 | --without-pear \ 249 | --disable-cgi \ 250 | --disable-debug \ 251 | --disable-phpdbg \ 252 | --disable-rpath \ 253 | --enable-option-checking=fatal \ 254 | --enable-fd-setsize=$(ulimit -n) \ 255 | --with-mhash \ 256 | --with-iconv=/usr \ 257 | $(if_no ${PHP_CLI} --disable-cli) \ 258 | $(if_no ${PHP_IPV6} --disable-ipv6) \ 259 | $(if_yes ${PHP_FPM} --enable-fpm) \ 260 | $(if_php_ver ge 7.2.0 \ 261 | $(if_yes ${PHP_ARGON2} --with-password-argon2) \ 262 | $(if_yes ${EXT_SODIUM} --with-sodium=/usr) \ 263 | ) \ 264 | $(if_php_ver ge 8.0.0 \ 265 | $(if_yes ${EXT_FFI} --with-ffi) \ 266 | $(if_no ${EXT_OPCACHE_JIT} --disable-opcache-jit) \ 267 | ) \ 268 | $(if_no ${EXT_POSIX} --disable-posix) \ 269 | $(if_no ${EXT_CTYPE} --disable-ctype) \ 270 | $(if_no ${EXT_PHAR} --disable-phar) \ 271 | $(if_no ${EXT_FILEINFO} --disable-fileinfo) \ 272 | $(if_no ${EXT_FILTER} --disable-filter) \ 273 | $(if_no ${EXT_TOKENIZER} --disable-tokenizer) \ 274 | $(if_yes ${EXT_INTL} --enable-intl) \ 275 | $(if_yes ${EXT_PCNTL} --enable-pcntl) \ 276 | $(if_yes ${EXT_FTP} --enable-ftp) \ 277 | $(if_yes ${EXT_BCMATH} --enable-bcmath) \ 278 | $(if_yes ${EXT_CURL} --with-curl=/usr) \ 279 | $(if_yes ${EXT_GMP} --with-gmp=/usr) \ 280 | $(if_yes ${EXT_BZ2} --with-bz2=/usr) \ 281 | $(if_yes ${EXT_READLINE} --with-readline=/usr) \ 282 | $(if_no ${EXT_SQLITE3} --without-sqlite3) \ 283 | $(if_yes ${EXT_SQLITE3} --with-sqlite3=/usr) \ 284 | $(if_no ${EXT_PCRE_BUNDLED} \ 285 | $(if_php_ver lt 7.4.0 --with-pcre-regex=/usr) \ 286 | $(if_php_ver ge 7.4.0 --with-external-pcre=/usr) \ 287 | ) \ 288 | $(if_yes ${EXT_OPENSSL} \ 289 | $(if_eq "${LIB_SSL}${EXT_OPENSSL_SYSTEM_CIPHERS}" 'opensslYES' --with-system-ciphers) \ 290 | --with-openssl=/usr \ 291 | ) \ 292 | $(if_yes ${EXT_ZLIB} --with-zlib=/usr) \ 293 | $(if_yes ${EXT_ZIP} \ 294 | $(if_no ${EXT_ZIP_BUNDLED} --with-libzip=/usr) \ 295 | --enable-zip \ 296 | --with-zlib=/usr \ 297 | ) \ 298 | $(contains "${EXT_DOM}${EXT_SIMPLEXML}${EXT_XML}${EXT_XMLREADER}${EXT_XMLWRITER}${EXT_XSL}" 'YES' \ 299 | $(if_no ${EXT_DOM} --disable-dom) \ 300 | $(if_no ${EXT_XML} --disable-xml) \ 301 | $(if_no ${EXT_XMLREADER} --disable-xmlreader) \ 302 | $(if_no ${EXT_XMLWRITER} --disable-xmlwriter) \ 303 | $(if_no ${EXT_SIMPLEXML} --disable-simplexml) \ 304 | $(if_yes ${EXT_XSL} --with-xsl=/usr) \ 305 | ) \ 306 | $(if_eq "${EXT_DOM}${EXT_SIMPLEXML}${EXT_XML}${EXT_XMLREADER}${EXT_XMLWRITER}${EXT_XSL}" 'NONONONONONO' \ 307 | $(if_php_ver lt 7.4.0 --disable-libxml) \ 308 | $(if_php_ver ge 7.4.0 --without-libxml) \ 309 | --disable-dom \ 310 | --disable-xml \ 311 | --disable-xmlreader \ 312 | --disable-xmlwriter \ 313 | --disable-simplexml \ 314 | ) \ 315 | $(if_eq "${EXT_PDO_SQLITE}${EXT_PDO_PGSQL}${EXT_PDO_MYSQL}" 'NONONO' \ 316 | --disable-pdo \ 317 | ) \ 318 | $(contains "${EXT_PDO_SQLITE}${EXT_PDO_PGSQL}${EXT_PDO_MYSQL}" 'YES' \ 319 | $(if_no ${EXT_PDO_SQLITE} --without-pdo-sqlite) \ 320 | $(if_yes ${EXT_PDO_SQLITE} --with-pdo-sqlite=/usr) \ 321 | $(if_yes ${EXT_PDO_PGSQL} --with-pdo-pgsql=/usr) \ 322 | $(if_yes ${EXT_PDO_MYSQL} \ 323 | $(if_no ${EXT_PDO_MYSQL_BUNDLED} --with-pdo-mysql=/usr) \ 324 | $(if_yes ${EXT_PDO_MYSQL_BUNDLED} --with-pdo-mysql=mysqlnd) \ 325 | ) \ 326 | ) \ 327 | $(if_yes ${EXT_GD} \ 328 | $(if_php_ver lt 7.4.0 \ 329 | $(if_no ${EXT_GD_BUNDLED} \ 330 | --with-gd=/usr \ 331 | --with-jpeg-dir=/usr \ 332 | --with-xpm-dir=/usr \ 333 | ) \ 334 | $(if_yes ${EXT_GD_BUNDLED} \ 335 | $(if_yes ${EXT_GD_JPEG} --with-jpeg-dir=/usr) \ 336 | $(if_yes ${EXT_GD_XPM} --with-xpm-dir=/usr) \ 337 | --with-gd \ 338 | ) \ 339 | $(if_yes ${EXT_GD_WEBP} --with-webp-dir=/usr) \ 340 | $(if_yes ${EXT_GD_FREETYPE} --with-freetype-dir=/usr) \ 341 | --with-png-dir=/usr \ 342 | ) \ 343 | $(if_php_ver ge 7.4.0 \ 344 | $(if_no ${EXT_GD_BUNDLED} --with-external-gd=/usr) \ 345 | $(if_yes ${EXT_GD_BUNDLED} \ 346 | $(if_yes ${EXT_GD_AVIF} --with-avif) \ 347 | ) \ 348 | --enable-gd \ 349 | ) \ 350 | ) \ 351 | $(if_yes ${EXT_MBSTRING} \ 352 | $(if_no ${EXT_MBSTRING_REGEX} --disable-mbregex) \ 353 | $(if_yes ${EXT_MBSTRING_REGEX} \ 354 | $(if_php_ver lt 7.4.0 $(if_no ${EXT_MBSTRING_REGEX_BUNDLED} --with-onig=/usr)) \ 355 | --enable-mbregex \ 356 | ) \ 357 | --enable-mbstring \ 358 | ) \ 359 | CFLAGS="${PHP_CFLAGS:-}" \ 360 | CPPFLAGS="${PHP_CFLAGS:-}" \ 361 | LDFLAGS="${PHP_LDFLAGS:-}" \ 362 | ; \ 363 | make; \ 364 | make install; \ 365 | \ 366 | ext_config_dir=$(php --ini | sed -rn "s/.*\.ini files in:\s*(.*)/\1/p"); \ 367 | [ -d ${ext_config_dir} ] || mkdir -p ${ext_config_dir}; \ 368 | \ 369 | echo "zend_extension=opcache.so" >> ${ext_config_dir}/01-opcache.ini; \ 370 | \ 371 | if [ ${EXT_XDEBUG} = 'YES' ]; then \ 372 | case 1 in \ 373 | $(if_php_ver lt 7.1.0 1)) EXT_XDEBUG_VERSION=2.7.2 ;; \ 374 | $(if_php_ver lt 7.2.0 1)) EXT_XDEBUG_VERSION=2.9.8 ;; \ 375 | esac; \ 376 | load_archive "https://github.com/xdebug/xdebug/archive/${EXT_XDEBUG_VERSION}.tar.gz"; \ 377 | cd /tmp/xdebug-${EXT_XDEBUG_VERSION}; \ 378 | make_ext; \ 379 | echo "zend_extension=xdebug.so" >> ${ext_config_dir}/01-xdebug.ini; \ 380 | fi; \ 381 | if [ ${EXT_MSGPACK} = 'YES' ]; then \ 382 | load_archive "https://github.com/msgpack/msgpack-php/archive/msgpack-${EXT_MSGPACK_VERSION}.tar.gz"; \ 383 | cd /tmp/msgpack-php-msgpack-${EXT_MSGPACK_VERSION}; \ 384 | make_ext; \ 385 | echo "extension=msgpack.so" >> ${ext_config_dir}/02-msgpack.ini; \ 386 | fi; \ 387 | if [ ${EXT_APCU} = 'YES' ]; then \ 388 | load_archive "https://github.com/krakjoe/apcu/archive/v${EXT_APCU_VERSION}.tar.gz"; \ 389 | cd /tmp/apcu-${EXT_APCU_VERSION}; \ 390 | make_ext \ 391 | --$(if_yes ${EXT_APCU_RWLOCKS} enable)$(if_no ${EXT_APCU_RWLOCKS} disable)-apcu-rwlocks \ 392 | --$(if_yes ${EXT_APCU_SPINLOCKS} enable)$(if_no ${EXT_APCU_SPINLOCKS} disable)-apcu-spinlocks; \ 393 | echo "extension=apcu.so" >> ${ext_config_dir}/03-apcu.ini; \ 394 | fi; \ 395 | if [ ${EXT_PHPREDIS} = 'YES' ]; then \ 396 | load_archive "https://github.com/phpredis/phpredis/archive/${EXT_PHPREDIS_VERSION}.tar.gz"; \ 397 | cd /tmp/phpredis-${EXT_PHPREDIS_VERSION}; \ 398 | make_ext \ 399 | $(if_yes ${EXT_PHPREDIS_LZ4} --enable-redis-lz4 --with-liblz4=/usr) \ 400 | $(if_yes ${EXT_PHPREDIS_ZSTD} --enable-redis-zstd --with-libzstd=/usr) \ 401 | --$(if_yes ${EXT_PHPREDIS_SESSION} enable)$(if_no ${EXT_PHPREDIS_SESSION} disable)-redis-session \ 402 | --$(if_yes ${EXT_PHPREDIS_JSON} enable)$(if_no ${EXT_PHPREDIS_JSON} disable)-redis-json \ 403 | $(if_yes ${EXT_PHPREDIS_MSGPACK} \ 404 | $(if_yes ${EXT_MSGPACK} --enable-redis-msgpack) \ 405 | ); \ 406 | echo "extension=redis.so" >> ${ext_config_dir}/03-redis.ini; \ 407 | fi; \ 408 | if [ ${EXT_MEMCACHED} = 'YES' ]; then \ 409 | load_archive "https://github.com/php-memcached-dev/php-memcached/archive/v${EXT_MEMCACHED_VERSION}.tar.gz"; \ 410 | cd /tmp/php-memcached-${EXT_MEMCACHED_VERSION}; \ 411 | make_ext \ 412 | --disable-memcached-sasl \ 413 | --with-zlib-dir=/usr \ 414 | --$(if_yes ${EXT_MEMCACHED_SESSION} enable)$(if_no ${EXT_MEMCACHED_SESSION} disable)-memcached-session \ 415 | --$(if_yes ${EXT_MEMCACHED_JSON} enable)$(if_no ${EXT_MEMCACHED_JSON} disable)-memcached-json \ 416 | $(if_yes ${EXT_MEMCACHED_MSGPACK} \ 417 | $(if_yes ${EXT_MSGPACK} --enable-memcached-msgpack) \ 418 | ); \ 419 | echo "extension=memcached.so" >> ${ext_config_dir}/03-memcached.ini; \ 420 | fi; \ 421 | if [ ${EXT_MONGODB} = 'YES' ]; then \ 422 | case 1 in \ 423 | $(if_php_ver lt 7.1.0 1)) EXT_MONGODB_VERSION=1.11.1 ;; \ 424 | $(if_php_ver lt 7.2.0 1)) EXT_MONGODB_VERSION=1.12.0 ;; \ 425 | esac; \ 426 | MONGODB_ARCHIVE="mongodb-${EXT_MONGODB_VERSION}"; \ 427 | load_archive "https://github.com/mongodb/mongo-php-driver/releases/download/${EXT_MONGODB_VERSION}/${MONGODB_ARCHIVE}.tgz"; \ 428 | cd /tmp/${MONGODB_ARCHIVE}; \ 429 | make_ext \ 430 | --with-mongodb-sasl=no \ 431 | --with-mongodb-ssl=$(if_yes ${EXT_MONGODB_TLS} ${lib_ssl})$(if_no ${EXT_MONGODB_TLS} no) \ 432 | $(if_eq "${EXT_MONGODB_TLS}${lib_ssl}${EXT_OPENSSL_SYSTEM_CIPHERS}" 'YESopensslYES' \ 433 | --enable-mongodb-crypto-system-profile=on; \ 434 | ); \ 435 | echo "extension=mongodb.so" >> ${ext_config_dir}/03-mongodb.ini; \ 436 | fi; \ 437 | if [ ${EXT_AMQP} = 'YES' ]; then \ 438 | load_archive "https://github.com/php-amqp/php-amqp/archive/v${EXT_AMQP_VERSION}.tar.gz"; \ 439 | cd /tmp/php-amqp-${EXT_AMQP_VERSION}; \ 440 | make_ext \ 441 | --with-librabbitmq-dir=/usr; \ 442 | echo "extension=amqp.so" >> ${ext_config_dir}/03-amqp.ini; \ 443 | fi; \ 444 | \ 445 | : "-- Out: clean up"; \ 446 | find /usr/local/lib/php -depth \( -type f -not -name '*.so' -or -type d -empty \) -delete; \ 447 | \ 448 | if [ ${OUT_STRIP} = 'YES' ]; then \ 449 | : "-- Out: strip executables"; \ 450 | find /usr/local -type f -executable \ 451 | -exec strip --strip-unneeded '{}' + || true; \ 452 | fi; \ 453 | \ 454 | runtime_deps=$(get_deps /usr/local/bin /usr/local/lib | sed -rn "s/\/usr\/lib\/(.*)/so:\1/p"); \ 455 | apk add --no-cache --virtual .php-runtime ${runtime_deps}; \ 456 | \ 457 | : "-- Remove build dependencies, clean temporary files"; \ 458 | apk del --no-network .php-build*; \ 459 | rm -rf /tmp/* /var/tmp/* 460 | 461 | STOPSIGNAL SIGQUIT 462 | 463 | CMD ["php"] 464 | --------------------------------------------------------------------------------