====== 製作 php Docker Image 紀錄 ====== 因為想將之前一個 php 專案改用 Docker 方式處理, 進行修改的紀錄 ===== 原本系統安裝方式 ===== * OS : CentOS Linux release 7.5.1804 (Core) (PVE VM) * 安裝可支援套件 yum install epel-release rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum install -y sysstat net-snmp freetds subversion php70w php70w-opcache php70w-mysql php70w-gd php70w-mbstring php70w-soap php70w-xml php70w-pdo_dblib * 安裝 Composer su - root php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('SHA384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php php -r "unlink('composer-setup.php');" * 安裝 Google Client Library php composer.phar require google/apiclient:^2.0 * 安裝專案 php 程式碼 mkdir -p /root/googlesheet/ svn co https://192.168.1.30/repos/erptools/googlesheet/ /root/googlesheet/ cd /root/googlesheet/ ln -s ../vendor . * 使用語法 php /root/googlesheet/db-googlesheet.php 1I8mYIdjXZKPIGVMmpre8cTqIPxxxxxxxxxxJNr9zehE ===== 改成 Dockerfile 安裝方式 ===== * 環境改變項目: * php 改用 7.1 -> docker hub php:7.1-cli (OS:debian 10) * 改用 git repo * 程式碼修改 * 要增加支援 PostgreSQL * 將原本讀取 DB 設定檔改用環境變數方式處理 * 先使用 docker run -i -t php:7.1-cli bash 進行安裝驗證, 然後將驗證的語法寫成以下 Dockerfile 內容 FROM dockerhub/library/php:7.1-cli # Install OS tools RUN apt-get update && apt-get install --no-install-recommends -y \ wget \ vim \ git \ unzip \ gnupg # Set timezone ENV TZ=Asia/Taipei RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # Add PostgreSQL repository RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main" > /etc/apt/sources.list.d/pgdg.list \ && curl -k -s https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - # Install PHP extensions deps RUN apt-get update && apt-get install --no-install-recommends -y \ postgresql-server-dev-10 \ unixodbc-dev \ freetds-bin \ freetds-dev \ libssl-dev \ openssl # Install PHP extensions RUN docker-php-ext-configure pdo_dblib --with-libdir=/lib/x86_64-linux-gnu \ && pecl install sqlsrv-4.1.6.1 \ && pecl install pdo_sqlsrv-4.1.6.1 \ && docker-php-ext-install \ mbstring \ pgsql \ mysqli \ pdo_pgsql \ pdo_mysql \ pdo_dblib \ && docker-php-ext-enable \ sqlsrv \ pdo_sqlsrv \ opcache # Clean repository RUN apt-get clean \ && rm -rf /var/lib/apt/lists/* # Install Composer RUN curl -sS https://getcomposer.org/installer | php -- \ --install-dir=/usr/local/bin \ --filename=composer # Install composer lib RUN mkdir -p /root/googlesheet/ \ && cd /root/googlesheet/ \ && composer require google/apiclient:^2.0 # install php repo # cd /root && git clone https://192.168.1.31/root/erptools_googlesheet.git # cp -f /root/erptools_googlesheet/app/* /root/googlesheet/ COPY app /root/googlesheet WORKDIR /root/googlesheet ENTRYPOINT ["php", "db-googlesheet.php"] * db-googlesheet.php 內 * 增加依據環境變數 TZ 的值來設定時區 : require_once __DIR__ . '/vendor/autoload.php'; if (isset($_ENV["TZ"])) { date_default_timezone_set($_ENV["TZ"]); } : * 依據環境變數來設定原本設定檔案的參數 : // 判別環境變數是否有定義 DB_ID / DB_SERVER / DB_NAME / DB_USER / DB_PASSWD $db_id = $_ENV["DB_ID"]; if ($db_id == $t_DB_ID) { $db_server = $_ENV["DB_SERVER"]; $db_port = $_ENV["DB_PORT"]; $db_name = $_ENV["DB_NAME"]; $db_user = $_ENV["DB_USER"]; $db_passwd = $_ENV["DB_PASSWD"]; } else { print("The source database connection information (DB_ID, DB_SERVER, DB_NAME, DB_USER, DB_PASSWD) should be defined in the environment variables!\n"); exit; } : * 建立出的 docker image 為 tryweb/db-googlesheet:latest * 使用語法 docker run \ -e DB_ID=dev3-redmine \ -e DB_SERVER=192.168.4.13 \ -e DB_PORT=5432 \ -e DB_NAME=redminedb \ -e DB_USER=redmine \ -e DB_PASSWD=hBp1wxxxxxxxxxxsxgBmLv7Em4Hx \ tryweb/db-googlesheet 1I8mYIdjXZKPIGVMmpre8cTqIPxxxxxxxxxxJNr9zehE ===== 參考網址 ===== * https://github.com/merorafael/docker-php-cli/blob/master/7.1/Dockerfile * https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ {{tag>docker k8s php}}