🧅

DockerでPerlの環境を作成する

2022/06/26に公開

作成したもの

アイドルマスターのキャラクターを検索できるアプリケーションです。

https://github.com/OHMORIYUSUKE/perl-mysql-apache-on-docker

LTした時のスライドです

https://drive.google.com/file/d/1L5wfVi3rbAPph9fXbBAGccpMf1h5arfW/view?usp=sharing

データベース内の情報はこちらのレポジトリのSQLを使用させていただきました。

https://github.com/yagi2/imas_api

詳細

ApachでPerlを動作させ、Docker上のMySQLからデータを取得しています。

サーバー

Ubuntuにapache2mysql-clientDBD::mysqlなどをインストールします。
これで、PerlからMySQLに接続可能にします。

/server/Dockerfile
FROM ubuntu:16.04

RUN \
    DEBIAN_FRONTEND=noninteractive && \
    apt-get update && \
    apt-get install -y \
        build-essential \
        apt-utils \
        ssl-cert \
        apache2 \
        apache2-utils \
        apache2-dev \
        libapache2-mod-perl2 \
        libapache2-mod-perl2-dev \
        libcgi-pm-perl \
        liblocal-lib-perl \
        cpanminus \
        libexpat1-dev \
        libssl-dev \
        mysql-client \
        libmysqlclient-dev \
        libapreq2-dev \
        zip && \
    cpanm DBD::mysql && \
    a2enmod cgid && \
    a2enmod rewrite && \
    a2dissite 000-default && \
    apt-get update -y && \
    apt-get upgrade -y && \
    apt-get -y clean

COPY localhost.conf /etc/apache2/sites-enabled/localhost.conf

COPY ./app /var/www/html

RUN chmod 777 /var/www/html/
RUN chmod 777 /usr/bin/perl

VOLUME ["/var/www/html"]

EXPOSE 80

ENTRYPOINT [ "/usr/sbin/apache2ctl", "-D", "FOREGROUND" ]

Apachの設定

DocumentRoot /var/www/htmlと設定し、/var/www/htmlにPerlのファイルを配置してください。

AddHandler cgi-script .cgi .plと設定し、.plファイルをCGIとして実行できるようにします。

/server/localhost.conf
ServerName localhost
AddHandler cgi-script .cgi .pl

<Directory /var/www/html>
    Options All
    AllowOverride All
</Directory>

<VirtualHost *:80>
    DocumentRoot /var/www/html
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

MySQL

MySQLのコンテナです。

./db/init:/docker-entrypoint-initdb.d

/docker-entrypoint-initdb.d.sqlを配置することで、MySQL起動時にデータを挿入しています。

/docker-compose.yml
db:
    build: ./db
    volumes:
      - ./db/save_data:/var/lib/mysql
      - ./db/init:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: fuel_dev
      MYSQL_USER: test
      MYSQL_PASSWORD: test
    ports:
      - 3306:3306

まとめ

  • Perlのファイルの改行コードはLFにする。
  • /var/www/html/には、755のようなパーミッションを与える。
    • Perl(CGI)を実行するユーザー(www-data)に実行権限読み取り権限を与える必要があります。

Discussion