작업실
서버 분류

php 도커 이미지에 ffmpeg 추가하기

컨텐츠 정보

본문

3232235777_b9wLOExG_db25388b1982ff041588ba6fa0265b2c9cd75977.png 



1. 들어가며


최근 그누보드5.4에 움직이는 gif 이미지를 mp4 동영상으로 변환하는 플러그인이 올라왔습니다.


https://sir.kr/g5_plugin/7476


그누보드 개발자인 thisgun님께서 직접 올려주셨습니다.


하지만 아쉽게도 웹호스팅에서는 거의 불가능합니다.


거의라고 표현한 것은 될 수도 있다는데 그 방법을 제가 몰라서 그렇습니다. ^^;;


아무튼 ffmpeg를 실행할 수 있어야 하는데, 우분투의 경우 그냥 



sudo apt install ffmpeg


위 명령어 하나면 바로 됩니다.


CentOS8에서는 https://sir.kr/g5_tip/14209 이 방법으로 설치가 가능하다고 합니다.


물론 php의 exec 명령어를 쓸 수 있어야되지만, 보통 되니깐요 ㅎㅎ


안된다면 php.ini 에서 disable_functions에 exec가 있는지 확인 후 제거하고 php-fpm을 재실행하면 됩니다.


이렇듯 실제서버에서는 쉽게 사용 가능합니다.


하지만 도커에 돌아가는 그누보드에서는 ffmpeg 사용이 불가능한데요.


ffmpeg 도커 이미지를 활용해서 도커에 있는 그누보드에서 실행 가능한지 봤는데, 아직까지는 힘든 것으로 보입니다.



2. php 도커 이미지에 ffmpeg 설치하기


구글링해보니 그냥 php 도커 이미지에 ffmpeg 패키지를 설치하면 사용할 수 있다고 하여 해보니 잘되더군요!


php 이미지는 지난번 도커에 그누보드 설치하기(링크)에서 사용한 워드프레스용 php7.4-fpm-alpine 이미지를 활용할 것입니다.


이미지를 직접 쓰는건 아니고, Dokerfile를 활용할 것입니다.



위 명령어로 도커파일을 받습니다.



nano Dockerfile


위 명령어로 도커파일을 수정합니다.


11번째 줄에 보면



# Alpine package for "imagemagick" contains ~120 .so files, see: https://github.com/docker-library/wordpress/pull/497
		imagemagick


위 내용이 있는데요.


위 내용을



# Alpine package for "imagemagick" contains ~120 .so files, see: https://github.com/docker-library/wordpress/pull/497
		imagemagick \
# For gnuboard ffmpeg gif2mp4
		ffmpeg 


위 내용으로 바꿔줍니다.



추가로 php-redis도 설치할 수 있는데요.


대략 34~38번째 줄을 보면



	pecl install imagick-3.4.4; \
	docker-php-ext-enable imagick; \


위 내용이 있는데



	pecl install imagick-3.4.4 redis; \
	docker-php-ext-enable imagick redis; \


위와 같이 redis를 추가해줍니다.


그러면 이미지 빌드할 때 php-redis가 설치됩니다.



그리고 워드프레스 대신 그누보드를 사용할 것이므로 


73~ 75번째 줄 이하에 있는



ENV WORDPRESS_VERSION 5.5
ENV WORDPRESS_SHA1 03fe1a139b3cd987cc588ba95fab2460cba2a89e


RUN set -ex; \
	curl -o wordpress.tar.gz -fSL "https://wordpress.org/wordpress-${WORDPRESS_VERSION}.tar.gz"; \
	echo "$WORDPRESS_SHA1 *wordpress.tar.gz" | sha1sum -c -; \
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
	tar -xzf wordpress.tar.gz -C /usr/src/; \
	rm wordpress.tar.gz; \
	chown -R www-data:www-data /usr/src/wordpress; \
# pre-create wp-content (and single-level children) for folks who want to bind-mount themes, etc so permissions are pre-created properly instead of root:root
	mkdir wp-content; \
	for dir in /usr/src/wordpress/wp-content/*/; do \
		dir="$(basename "${dir%/}")"; \
		mkdir "wp-content/$dir"; \
	done; \
	chown -R www-data:www-data wp-content; \
	chmod -R 777 wp-content


워드프레스 관련 내용을 지워줍니다.


컨트롤 + K를 누르면 한줄씩 지워집니다.


컨트롤 + O, 엔터, 컨트롤 + X로 저장 후 나옵니다.


이제 그누보드 자동설치 스크립트도 만들 수 있는데요.



nano docker-entrypoint.sh


위 명령어를 내린 후 



#!/bin/bash
set -euo pipefail
if [ ! -e data ]; then
curl -o gnuboard.tar.gz -fSL https://github.com/gnuboard/gnuboard5/tarball/master \
&& tar -xf gnuboard.tar.gz -C ./ --strip-components=1 \
&& rm gnuboard.tar.gz && mkdir data \
&& chown -R www-data:www-data ./ \
&& chmod -R 777 data
fi
exec "$@"


위 내용을 넣습니다. 위 내용은 /var/www/html 에 data라는 폴더가 없으면 그누보드 최신 버전을 다운받아서 덮어쓴 후 data폴더를 만듭니다.


컨트롤 + O, 엔터, 컨트롤 + X로 빠져나옵니다.



chmod +x docker-entrypoint.sh


위 명령어로 실행가능한 상태로 바꿉니다.


이제 수정한 Dockerfile과 docker-entrypoint.sh를 이용하여 ffmpeg 명령어가 가능한 그누보드용 php 이미지를 생성할 것입니다.


만약 이미지에 그누보드 자동설치 스크립트를 넣고 싶지 않다면, 94~98번째 줄 정도에 있는



COPY docker-entrypoint.sh /usr/local/bin/


ENTRYPOINT ["docker-entrypoint.sh"]


위 내용을 지우면 됩니다.


3. 새로운 이미지 Build 하기



sudo docker build -t gnuboard-ffmpeg-fpm-alpine:1.0.0 .


위 명령어로 Dockerfile과 docker-entrypoint.sh이 들어간 이미지가 생성됩니다.


gnuboard-ffmpeg-fpm-alpine 라는 이름의 이미지가 생성되고, tag는 1.0.0 이 붙습니다.


새로 빌드하기 때문에 상당히 오래걸립니다. 5 ~ 10분 정도 걸릴 수 있습니다.



.
.
.
.
.
Build process completed successfully
Installing '/usr/local/lib/php/extensions/no-debug-non-zts-20190902/redis.so'
install ok: channel://pecl.php.net/redis-5.3.1
configuration option "php_ini" is not set to php.ini location
You should add "extension=imagick.so" to php.ini
configuration option "php_ini" is not set to php.ini location
You should add "extension=imagick.so" to php.ini
configuration option "php_ini" is not set to php.ini location
You should add "extension=redis.so" to php.ini
+ docker-php-ext-enable imagick redis
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
(1/1) Installing .docker-php-ext-enable-deps (20200817.151442)
OK: 395 MiB in 144 packages
WARNING: Ignoring APKINDEX.2c4ac24e.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.40a3604f.tar.gz: No such file or directory
(1/1) Purging .docker-php-ext-enable-deps (20200817.151442)
OK: 395 MiB in 143 packages
+ + + tr , '\n'
scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions
+ awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }'sort -u


+ runDeps='so:libMagickCore-7.Q16HDRI.so.7
so:libMagickWand-7.Q16HDRI.so.7
so:libc.musl-x86_64.so.1
so:libfreetype.so.6
so:libjpeg.so.8
so:libpng16.so.16
so:libsodium.so.23
so:libz.so.1
so:libzip.so.5'
+ apk add --virtual .wordpress-phpexts-rundeps so:libMagickCore-7.Q16HDRI.so.7 so:libMagickWand-7.Q16HDRI.so.7 so:libc.musl-x86_64.so.1 so:libfreetype.so.6 so:libjpeg.so.8 so:libpng16.so.16 so:libsodium.so.23 so:libz.so.1 so:libzip.so.5
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
(1/1) Installing .wordpress-phpexts-rundeps (20200817.151443)
OK: 395 MiB in 144 packages
+ apk del .build-deps
(1/30) Purging .build-deps (20200817.151019)
(2/30) Purging autoconf (2.69-r2)
(3/30) Purging m4 (1.4.18-r1)
(4/30) Purging dpkg-dev (1.20.0-r0)
(5/30) Purging perl (5.30.3-r0)
(6/30) Purging dpkg (1.20.0-r0)
(7/30) Purging file (5.38-r0)
(8/30) Purging g++ (9.3.0-r2)
(9/30) Purging gcc (9.3.0-r2)
(10/30) Purging binutils (2.34-r1)
(11/30) Purging libatomic (9.3.0-r2)
(12/30) Purging libgomp (9.3.0-r2)
(13/30) Purging libgphobos (9.3.0-r2)
(14/30) Purging libc-dev (0.7.2-r3)
(15/30) Purging musl-dev (1.1.24-r9)
(16/30) Purging make (4.3-r0)
(17/30) Purging re2c (1.3-r1)
(18/30) Purging freetype-dev (2.10.2-r0)
(19/30) Purging imagemagick-dev (7.0.10.25-r0)
(20/30) Purging imagemagick-c++ (7.0.10.25-r0)
(21/30) Purging libjpeg-turbo-dev (2.0.5-r0)
(22/30) Purging libpng-dev (1.6.37-r1)
(23/30) Purging libzip-dev (1.6.1-r1)
(24/30) Purging zlib-dev (1.2.11-r3)
(25/30) Purging xz-dev (5.2.5-r0)
(26/30) Purging libmagic (5.38-r0)
(27/30) Purging isl (0.18-r0)
(28/30) Purging mpc1 (1.1.0-r1)
(29/30) Purging mpfr4 (4.0.2-r4)
(30/30) Purging brotli-dev (1.0.7-r5)
Executing busybox-1.31.1-r16.trigger
OK: 151 MiB in 114 packages
Removing intermediate container e343248aadb9
 ---> dd37329bb614
Step 4/9 : RUN set -eux;        docker-php-ext-enable opcache;  {               echo 'opcache.memory_consumption=128';          echo 'opcache.interned_strings_buffer=8';               echo 'opcache.max_accelerated_files=4000';              echo 'opcache.revalidate_freq=2';            echo 'opcache.fast_shutdown=1';  } > /usr/local/etc/php/conf.d/opcache-recommended.ini
 ---> Running in 7ac8e1b58279
+ docker-php-ext-enable opcache
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
(1/2) Installing binutils (2.34-r1)
(2/2) Installing .docker-php-ext-enable-deps (20200817.151452)
Executing busybox-1.31.1-r16.trigger
OK: 161 MiB in 116 packages
(1/2) Purging .docker-php-ext-enable-deps (20200817.151452)
(2/2) Purging binutils (2.34-r1)
Executing busybox-1.31.1-r16.trigger
OK: 151 MiB in 114 packages
+ echo 'opcache.memory_consumption=128'
+ echo 'opcache.interned_strings_buffer=8'
+ echo 'opcache.max_accelerated_files=4000'
+ echo 'opcache.revalidate_freq=2'
+ echo 'opcache.fast_shutdown=1'
Removing intermediate container 7ac8e1b58279
 ---> 06dc7499266d
Step 5/9 : RUN {                echo 'error_reporting = E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_RECOVERABLE_ERROR';             echo 'display_errors = Off';            echo 'display_startup_errors = Off';            echo 'log_errors = On';               echo 'error_log = /dev/stderr';                 echo 'log_errors_max_len = 1024';               echo 'ignore_repeated_errors = On';             echo 'ignore_repeated_source = Off';            echo 'html_errors = Off';       } > /usr/local/etc/php/conf.d/error-logging.ini
 ---> Running in f0a841953c58
Removing intermediate container f0a841953c58
 ---> 074a3f8e6dc1
Step 6/9 : VOLUME /var/www/html
 ---> Running in 195ece142bbe
Removing intermediate container 195ece142bbe
 ---> 768b1e297984
Step 7/9 : COPY docker-entrypoint.sh /usr/local/bin/
 ---> eba5ffc56169
Step 8/9 : ENTRYPOINT ["docker-entrypoint.sh"]
 ---> Running in 6fb055e08a10
Removing intermediate container 6fb055e08a10
 ---> eb950491f510
Step 9/9 : CMD ["php-fpm"]
 ---> Running in c9dbb12710eb
Removing intermediate container c9dbb12710eb
 ---> ff405c87ce78
Successfully built ff405c87ce78
Successfully tagged gnuboard-ffmpeg-fpm-alpine:1.0.0


마지막에 Successfully tagged gnuboard-ffmpeg-fpm-alpine:1.0.0 이 뜨면 성공입니다.


이제 이 이미지를 가지고 그누보드 설치에 사용하면 됩니다.

관련자료

  • 서명
    우성짱의 NAS를 운영하고 있습니다.

    저의 즐거움이 여러분의 즐거움이면 좋겠습니다.

댓글 0
등록된 댓글이 없습니다.
전체 157 / 1 페이지
RSS

최근글


새댓글


알림 0