diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..9754e0bf0b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,12 @@ +.circleci +.git +.settings +nodes_modules +vendor + + + + + + + diff --git a/Dockerfile b/Dockerfile index c40dfc4347..ab22c72631 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,10 @@ -FROM php:7.0-fpm-stretch as builder +######################################################################### +# This image contains every build tools that will be used by the builder and +# the app images (usefull in dev mode) +######################################################################### + +FROM php:7.0-fpm-stretch as phraseanet-system RUN apt-get update \ && apt-get install -y \ apt-transport-https \ @@ -23,6 +28,7 @@ RUN apt-get update \ libxslt-dev \ libzmq3-dev \ locales \ + gettext \ mcrypt \ swftools \ unoconv \ @@ -61,9 +67,19 @@ RUN mkdir /entrypoint /var/alchemy \ && mkdir -p /home/app/.composer \ && chown -R app: /home/app /var/alchemy +######################################################################### +# This image is used to build the apps +######################################################################### + +FROM phraseanet-system as builder + WORKDIR /var/alchemy/ +# Files that are needed at build stage + COPY gulpfile.js /var/alchemy/ +COPY www/include /var/alchemy/www/include +COPY www/scripts/apps /var/alchemy/www/scripts/apps COPY Makefile /var/alchemy/ COPY package.json /var/alchemy/ COPY phpunit.xml.dist /var/alchemy/ @@ -73,11 +89,16 @@ COPY composer.json /var/alchemy/ COPY composer.lock /var/alchemy/ RUN make install_composer COPY resources /var/alchemy/resources -COPY www /var/alchemy/www + +# Application build phase + RUN make clean_assets RUN make install_asset_dependencies RUN make install_assets +# Application code + +COPY www /var/alchemy/www ADD ./docker/phraseanet/ / COPY lib /var/alchemy/lib COPY tmp /var/alchemy/tmp @@ -86,6 +107,9 @@ COPY grammar /var/alchemy/grammar COPY templates-profiler /var/alchemy/templates-profiler COPY templates /var/alchemy/templates COPY tests /var/alchemy/tests + +# Create needed folders + RUN mkdir -p /var/alchemy/Phraseanet/logs \ && chmod -R 777 /var/alchemy/Phraseanet/logs \ && mkdir -p /var/alchemy/Phraseanet/cache \ @@ -99,69 +123,11 @@ RUN mkdir -p /var/alchemy/Phraseanet/logs \ && mkdir -p /var/alchemy/Phraseanet/config \ && chmod -R 777 /var/alchemy/Phraseanet/config -# Phraseanet -FROM php:7.0-fpm-stretch as phraseanet-fpm -RUN apt-get update \ - && apt-get install -y \ - apt-transport-https \ - ca-certificates \ - gnupg2 \ - && apt-get update \ - && apt-get install -y --no-install-recommends zlib1g-dev \ - gettext \ - git \ - ghostscript \ - gpac \ - imagemagick \ - libav-tools \ - libfreetype6-dev \ - libicu-dev \ - libjpeg62-turbo-dev \ - libmagickwand-dev \ - libmcrypt-dev \ - libpng-dev \ - librabbitmq-dev \ - libssl-dev \ - libxslt-dev \ - libzmq3-dev \ - locales \ - mcrypt \ - swftools \ - unoconv \ - unzip \ - xpdf \ - && update-locale "LANG=fr_FR.UTF-8 UTF-8" \ - && dpkg-reconfigure --frontend noninteractive locales \ - && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ - && docker-php-ext-install -j$(nproc) gd \ - && docker-php-ext-install zip exif iconv mbstring pcntl sockets xsl intl pdo_mysql gettext bcmath mcrypt \ - && pecl install redis amqp-1.9.3 zmq-beta imagick-beta \ - && docker-php-ext-enable redis amqp zmq imagick \ - && pecl clear-cache \ - && docker-php-source delete \ - && rm -rf /var/lib/apt/lists/* +######################################################################### +# Phraseanet web application image +######################################################################### -RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \ - && php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \ - && php composer-setup.php --install-dir=/usr/local/bin --filename=composer \ - && php -r "unlink('composer-setup.php');" - -# Node Installation (node + yarn) -# Reference : -# https://linuxize.com/post/how-to-install-node-js-on-ubuntu-18.04/ -# https://yarnpkg.com/lang/en/docs/install/#debian-stable -RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \ - && apt install -y nodejs \ - && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ - && apt-get update && apt-get install -y --no-install-recommends yarn \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/ - -RUN mkdir /entrypoint /var/alchemy \ - && useradd -u 1000 app \ - && mkdir -p /home/app/.composer \ - && chown -R app: /home/app /var/alchemy +FROM phraseanet-system as phraseanet-fpm COPY --from=builder --chown=app /var/alchemy /var/alchemy/Phraseanet ADD ./docker/phraseanet/ / @@ -169,11 +135,17 @@ WORKDIR /var/alchemy/Phraseanet ENTRYPOINT ["/phraseanet-entrypoint.sh"] CMD ["/boot.sh"] -# phraseanet-worker +######################################################################### +# Phraseanet worker application image +######################################################################### + FROM phraseanet-fpm as phraseanet-worker CMD ["/worker-boot.sh"] +######################################################################### # phraseanet-nginx +######################################################################### + FROM nginx:1.15 as phraseanet-nginx RUN useradd -u 1000 app ADD ./docker/nginx/ / diff --git a/Dockerfile-debug b/Dockerfile-debug deleted file mode 100644 index ac52e11669..0000000000 --- a/Dockerfile-debug +++ /dev/null @@ -1,18 +0,0 @@ -ARG phraseanet -FROM $phraseanet - -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - iproute2 \ - && rm -rf /var/lib/apt/lists/* \ - && pecl install xdebug \ - && docker-php-ext-enable xdebug \ - && pecl clear-cache - -ADD ./docker/phraseanet-debug/ / - -RUN chmod +x /entrypoint.sh /usr/local/bin/docker-* - -ENTRYPOINT ["/entrypoint.sh"] - -CMD ["php-fpm"] diff --git a/build.sh b/build.sh index 0f983ccac4..60e95a3b7d 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -xe + # nginx server docker build --target phraseanet-nginx -t local/phraseanet-nginx:$1 . diff --git a/lib/Alchemy/Phrasea/Controller/Admin/SubdefsController.php b/lib/Alchemy/Phrasea/Controller/Admin/SubdefsController.php index e30aa03946..5c2a61f2e5 100644 --- a/lib/Alchemy/Phrasea/Controller/Admin/SubdefsController.php +++ b/lib/Alchemy/Phrasea/Controller/Admin/SubdefsController.php @@ -362,7 +362,7 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "256", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libx264", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], "240P H264 256 kbps ACC 128kbps" => [ @@ -373,7 +373,7 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "426", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libx264", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], "360P H264 576 kbps ACC 128kbps" => [ @@ -384,7 +384,7 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "480", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libtheora", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], "480P H264 750 kbps ACC 128kbps" => [ @@ -395,7 +395,7 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "854", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libx264", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], "720P H264 1492 kbps ACC 128kbps" => [ @@ -406,7 +406,7 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "1280", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libx264", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], "1080P H264 2420 kbps ACC 128kbps" => [ @@ -417,7 +417,7 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "1920", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libx264", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], "video codec libvpx" => null, @@ -429,7 +429,7 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "256", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libvpx", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], "240P webm 256 kbps ACC 128kbps" => [ @@ -440,7 +440,7 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "426", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libvpx", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], "360P webm 576 kbps ACC 128kbps" => [ @@ -451,7 +451,7 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "480", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libvpx", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], "480P webm 750 kbps ACC 128kbps" => [ @@ -462,7 +462,7 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "854", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libvpx", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], "720P webm 1492 kbps ACC 128kbps" => [ @@ -473,7 +473,7 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "1280", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libvpx", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], "1080P webm 2420 kbps ACC 128kbps" => [ @@ -484,7 +484,7 @@ class SubdefsController extends Controller Video::OPTION_SIZE => "1920", Video::OPTION_FRAMERATE => "25", Video::OPTION_VCODEC => "libvpx", - Video::OPTION_ACODEC => "libfaac", + Video::OPTION_ACODEC => "libmp3lame", Subdef::OPTION_DEVICE => ["all"] ], ], diff --git a/lib/Alchemy/Phrasea/Media/Subdef/Video.php b/lib/Alchemy/Phrasea/Media/Subdef/Video.php index ef0a113564..24a5812f90 100644 --- a/lib/Alchemy/Phrasea/Media/Subdef/Video.php +++ b/lib/Alchemy/Phrasea/Media/Subdef/Video.php @@ -33,7 +33,7 @@ class Video extends Audio $this->registerOption(new OptionType\Range($this->translator->trans('Frame Rate'), self::OPTION_FRAMERATE, 1, 200, 20)); $this->registerOption(new OptionType\Enum($this->translator->trans('Video Codec'), self::OPTION_VCODEC, ['libx264', 'libvpx', 'libtheora'], 'libx264')); $this->unregisterOption(self::OPTION_ACODEC); - $this->registerOption(new OptionType\Enum($this->translator->trans('Audio Codec'), self::OPTION_ACODEC, ['libfaac', 'libvo_aacenc', 'libmp3lame', 'libvorbis'], 'libfaac')); + $this->registerOption(new OptionType\Enum($this->translator->trans('Audio Codec'), self::OPTION_ACODEC, ['libfdk_aac', 'libvo_aacenc', 'libmp3lame', 'libvorbis'], 'libfdk_aac')); } public function getType() diff --git a/tests/classes/databox/subdefTest.php b/tests/classes/databox/subdefTest.php index f403712621..75fbc962b9 100644 --- a/tests/classes/databox/subdefTest.php +++ b/tests/classes/databox/subdefTest.php @@ -83,7 +83,7 @@ class databox_subdefTest extends \PHPUnit_Framework_TestCase 10 1 192 - libfaac + libmp3lame libx264 ';