diff --git a/docker/swoole/Dockerfile b/docker/swoole/Dockerfile new file mode 100644 index 00000000..6b147d7a --- /dev/null +++ b/docker/swoole/Dockerfile @@ -0,0 +1,66 @@ +FROM fedora:31 + +MAINTAINER Jeroen van Meeuwen + +LABEL io.k8s.description="Platform for serving PHP applications under Swoole" \ + io.k8s.display-name="Swoole 4.4.x" \ + io.openshift.expose-services="8000:http" \ + io.openshift.tags="builder,php,swoole" + +ENV SWOOLE_VERSION=4.4.x + +RUN dnf -y install \ + composer \ + diffutils \ + file \ + git \ + make \ + npm \ + openssl-devel \ + php-cli \ + php-common \ + php-devel \ + php-ldap \ + php-opcache \ + php-pecl-apcu \ + re2c && \ + git clone -b v4.4.x https://github.com/swoole/swoole-src.git/ /swoole-src.git/ && \ + cd /swoole-src.git/ && \ + git clean -d -f -x && \ + phpize --clean && \ + phpize && \ + ./configure \ + --enable-sockets \ + --disable-mysqlnd \ + --enable-http2 \ + --enable-openssl && \ + --enable-debug \ + --enable-debug-log \ + --enable-trace-log && \ + make -j4 && \ + make install && \ + cd / && \ + rm -rf /swoole-src.git/ && \ + dnf -y remove \ + diffutils \ + file \ + make \ + openssl-devel \ + php-devel \ + re2c && \ + dnf clean all && \ + echo "extension=swoole.so" >> /etc/php.d/swoole.ini && \ + php -m 2>&1 | grep -q swoole + +RUN groupadd -g 1001 default && \ + useradd -d /opt/app-root/ -u 1001 -g 1001 default + +USER default + +WORKDIR /opt/app-root/ + +COPY /rootfs / + +EXPOSE 8000 + +CMD [ "/usr/local/bin/usage" ] diff --git a/docker/swoole/do-it-again.sh b/docker/swoole/do-it-again.sh new file mode 100755 index 00000000..46892d1b --- /dev/null +++ b/docker/swoole/do-it-again.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +export APP_DEBUG="true" +export APP_KEY= +export APP_PUBLIC_URL=http://127.0.0.1:8000/ +export APP_SRC=src/ +export APP_URL=http://127.0.0.1:8000/ +export CACHE_DRIVER="array" +export COMPOSER_ARGS="--no-dev" +export DB_CONNECTION="sqlite" +export DB_DATABASE=":memory:" +export GIT_URI=https://git.kolab.org/source/kolab.git +export LARAVEL_ENV=production +export LOG_CHANNEL="stderr" +export MAIL_DRIVER="array" +export QUEUE_CONNECTION="sync" +export SESSION_DRIVER="array" +export SWOOLE_HTTP_HOST=0.0.0.0 +export SWOOLE_HTTP_PORT=8000 +export SWOOLE_HTTP_REACTOR_NUM=6 +export SWOOLE_HTTP_WORKER_NUM=6 + +docker build -t swoole . + +docker kill swoole + +docker rm swoole + +docker_opts="\ + -e APP_DEBUG=${APP_DEBUG} \ + -e APP_KEY=${APP_KEY} \ + -e APP_PUBLIC_URL=${APP_PUBLIC_URL} \ + -e APP_SRC=${APP_SRC} \ + -e APP_URL=${APP_URL} \ + -e CACHE_DRIVER=${CACHE_DRIVER} \ + -e COMPOSER_ARGS=${COMPOSER_ARGS} \ + -e DB_CONNECTION=${DB_CONNECTION} \ + -e DB_DATABASE=${DB_DATABASE} \ + -e GIT_URI=${GIT_URI} \ + -e LARAVEL_ENV=${LARAVEL_ENV} \ + -e LOG_CHANNEL=${LOG_CHANNEL} \ + -e MAIL_DRIVER=${MAIL_DRIVER} \ + -e QUEUE_CONNECTION=${QUEUE_CONNECTION} \ + -e SESSION_DRIVER=${SESSION_DRIVER} \ + -e SWOOLE_HTTP_HOST=${SWOOLE_HTTP_HOST} \ + -e SWOOLE_HTTP_PORT=${SWOOLE_HTTP_PORT} \ + -e SWOOLE_HTTP_REACTOR_NUM=${SWOOLE_HTTP_REACTOR_NUM} \ + -e SWOOLE_HTTP_WORKER_NUM=${SWOOLE_HTTP_WORKER_NUM}" + +docker run -it \ + ${docker_opts} \ + --name swoole swoole /usr/local/bin/build-image + +docker commit swoole swoole-s2i + +docker kill swoole-s2i + +docker rm swoole-s2i + +docker run -it -p 8000:8000 \ + ${docker_opts} \ + --name swoole-s2i swoole-s2i /usr/local/bin/run-container diff --git a/docker/swoole/rootfs/usr/local/bin/build-image b/docker/swoole/rootfs/usr/local/bin/build-image new file mode 100755 index 00000000..78f0f37b --- /dev/null +++ b/docker/swoole/rootfs/usr/local/bin/build-image @@ -0,0 +1,34 @@ +#!/bin/bash + +set -x + +set -e + +pwd + +if [ -z "${GIT_URI}" ]; then + echo "No GIT_URI specified. Exiting." + exit 1 +fi + +git clone -b ${GIT_BRANCH:-master} ${GIT_URI} + +cd $(basename ${GIT_URI} .git) + +if [ ! -z "${APP_SRC}" ]; then + cd ${APP_SRC} +fi + +if [ -f "composer.json" ]; then + echo "Detected composer.json, running install" + php -dmemory_limit=${COMPOSER_MEMORY_LIMIT:--1} /usr/bin/composer install ${COMPOSER_ARGS} + rm -rf ~/.cache/composer/ +fi + +if [ -z "${LARAVEL_ENV}" ]; then + LARAVEL_ENV=prod +fi + +npm install + +npm run ${LARAVEL_ENV} && rm -rf ~/.npm/ diff --git a/docker/swoole/rootfs/usr/local/bin/run-container b/docker/swoole/rootfs/usr/local/bin/run-container new file mode 100755 index 00000000..8e6df328 --- /dev/null +++ b/docker/swoole/rootfs/usr/local/bin/run-container @@ -0,0 +1,42 @@ +#!/bin/bash + +set -x + +set -e + +if [ -z "$@" ]; then + cd $(basename ${GIT_URI} .git) + + if [ ! -z "${APP_SRC}" ]; then + cd ${APP_SRC} + fi + + if [ ! -f ".env" -a -f ".env.example" ]; then + mv .env.example .env + fi + + if [ -z "${APP_KEY}" ]; then + ./artisan key:generate + unset APP_KEY + fi + + if [ -z "${JWT_SECRET}" ]; then + ./artisan jwt:secret -f + fi + + ./artisan clear-compiled + + # This should not occur in production + #./artisan cache:clear + + # A standalone environment doesn't have anything to ping + #timeout 10m ./artisan db:ping --wait + + ./artisan migrate + + env + + exec ./artisan swoole:http start +else + exec $@ +fi