2 분 소요

Docker를 사용하여 PHP 패키지 설치 없이 PHP 스크립트를 실행하는 방법에 대해 설명합니다.


테스트 환경

  • WSL2 Ubuntu
  • Docker Desktop

자세한 내용은 windows 10 에 WSL2, Ubuntu, Docker 설치 by mozily 를 참고하세요.




단순한 PHP 스크립트 실행하기

Docker를 사용하여 PHP 설치없이 스크립트를 실행해보겠습니다.
실행할 스트립트 test.php는 다음과 같습니다:

<?php

$t = time();
$date = date('Y-m-d H:i:s', $t);

echo "mon this week: " . date("Y-m-d", strtotime('monday this week', strtotime($date))), PHP_EOL;   
echo "sun this week: " . date("Y-m-d", strtotime('sunday this week', strtotime($date))), PHP_EOL;

echo "last week mon: " . date("Y-m-d", strtotime('last week monday', strtotime($date))), PHP_EOL;
echo "-1 week mon:   " . date("Y-m-d", strtotime('-1 week monday', strtotime($date))), PHP_EOL;


스크립트가 있는 디렉토리에서 다음 명령을 실행합니다:

$ docker container run --rm -v $(pwd):/app/ php:7.4-cli php /app/test.php

mon this week: 2020-10-19
sun this week: 2020-10-25
last week mon: 2020-10-12
-1 week mon:   2020-10-19


다음은 이 명령에 대한 설명입니다:

  • Docker 컨테이너는 php:7.4-cli 이미지를 사용합니다.
  • Docker 컨테이너가 사용할 수 있도록 호스트의 $(pwd)/test.php
    컨테이너의 /app/test.php 로 마운팅합니다.
  • 컨테이너를 php /app/test.php 명령으로 실행합니다.


PHP Changelog 를 보면,
5.6.23, 7.0.8 버전에서 주(week)는 항상 월요일부터 시작하는 것으로 변경되었다고 나와있습니다.
(Weeks always start on monday. Formerly, sunday would also be considered to start a week.)





확장 패키지가 필요한 스크립트를 실행하기

대부분의 스크립트는 확장 패키지가 필요합니다.
Docker의 기본 이미지에는 패키지가 설치되지 않았기 때문에, 패키지를 설치하기 위해서
Dockerfile 을 사용하겠습니다.

테스트를 위해서 스크립트를 다음과 같이 수정했습니다:

<?php

$t = time();
$date = date('Y-m-d H:i:s', $t);

echo "mon this week: " . date("Y-m-d", strtotime('monday this week', strtotime($date))), PHP_EOL;   
echo "sun this week: " . date("Y-m-d", strtotime('sunday this week', strtotime($date))), PHP_EOL;

echo "last week mon: " . date("Y-m-d", strtotime('last week monday', strtotime($date))), PHP_EOL;
echo "-1 week mon:   " . date("Y-m-d", strtotime('-1 week monday', strtotime($date))), PHP_EOL;

echo "change first day of week" . PHP_EOL;   
$cal = IntlCalendar::createInstance();
$cal->set(2020, 10, 25);
$cal->setFirstDayOfWeek(IntlCalendar::DOW_SUNDAY);

echo "mon this week: " . date("Y-m-d", strtotime('monday this week', strtotime($date))), PHP_EOL;   
echo "sun this week: " . date("Y-m-d", strtotime('sunday this week', strtotime($date))), PHP_EOL;


IntlCalendarintl 패키지를 사용하기 때문에 Docker 이미지에 intl 을 설치해야 합니다.
Docker 이미지에 패키지 설치를 설치하려면 Dockerfile 에 직접 명령을 추가해도 되지만,
쉽게 추가해주는 mlocati/docker-php-extension-installer 스크립트가 있습니다.

다음은 intl, xdebug 패키지를 설치한 Dockerfile 입니다.

FROM php:7.4-cli

ADD https://raw.githubusercontent.com/mlocati/docker-php-extension-installer/master/install-php-extensions /usr/local/bin/

RUN chmod uga+x /usr/local/bin/install-php-extensions && sync && \
    install-php-extensions intl xdebug


이미지를 빌드한 후 실행한 결과입니다:

$ docker build --tag {Tag}:{Version} .
$ docker run --rm -v $(pwd):/app/ {Tag}:{Version} php /app/test.php

mon this week: 2020-10-19
sun this week: 2020-10-25
last week mon: 2020-10-12
-1 week mon:   2020-10-19

change first day of week
mon this week: 2020-10-19
sun this week: 2020-10-25




XDebug 를 사용하여 디버깅하기

앞에서 xdebug 패키지를 설치했기 때문에, 다음 설정으로 .env 파일을 추가하면
스크립트를 디버깅할 수 있습니다:

# php
PHP_IDE_CONFIG=serverName={Server Name}
XDEBUG_CONFIG=remote_enable=on remote_host=host.docker.internal remote_port={Remote Port}




참고자료

댓글남기기