プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

Roundcube の立ち上げ: docker イメージを作成(2/3)

前回の記事の続きです。今回は、今まで試した設定を含めた dockerfile を作成して、イメージを作ることで簡単に起動できるようにしたいと思います。

docker イメージを作成

いろいろと試した設定を毎回手作業でやるのは面倒なので、 docker イメージを作成したいと思います。なお、作業は NAS に SSH でログインして、適当な作業ディレクトリを作ってそこで行っています。

dockerfile の作成

いままで検討した設定を反映するように、 dockerfile を作成します。

FROM roundcube/roundcubemail:1.5.3-apache

RUN set -ex; \
    sed -i "s/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/" /etc/ssl/openssl.cnf \
    ;
 
COPY ./config.docker.add_imap_conn_options.inc.php /var/roundcube/config/

config.docker.add_imap_conn_options.inc.php は、前の記事で書いた、 imap 接続時のオプション設定を書いたファイルです。

<?php

// IMAP socket context options
$config['imap_conn_options'] = [
  'ssl'         => [
    'verify_peer'  => true,
    'verify_depth' => 3,
  ],
];

// SMTP socket context options
$config['smtp_conn_options'] = [
  'ssl'         => [
    'verify_peer'  => true,
    'verify_depth' => 3,
  ],
];

/var/roundcube/config に設定ファイルを置いておくと読み込んでくれるということなので、ここに設定することにしました。

イメージを作成

作成した dockerfile を使ってイメージを作成してみます。

[ユーザ名@NAS名 myroundcube]$ docker build -t myroundcube .
Sending build context to Docker daemon  4.608kB
Step 1/3 : FROM roundcube/roundcubemail:1.5.3-apache
 ---> d2eac54d0366
Step 2/3 : RUN set -ex;     sed -i "s/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/" /etc/ssl/openssl.cnf     ;
 ---> Running in 4176d8859682
+ sed -i s/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/ /etc/ssl/openssl.cnf
Removing intermediate container 4176d8859682
 ---> 73ef52fbc915
Step 3/3 : COPY ./config.docker.add_imap_conn_options.inc.php /var/roundcube/config/
 ---> 664cbf63c985
Successfully built 664cbf63c985
Successfully tagged myroundcube:latest
[ユーザ名@NAS名 myroundcube]$ 

エラーなく、イメージが作成できました。

このイメージを使って、ちゃんと Container Station で起動するのか確認して、問題なく起動できればOKです。

(参考1)

roundcubemail-docker の github には、自分で使うプラグインをあらかじめインストールした docker image の作成方法が載っているので、ident_switch もこのようにしたいと思って下記のようにしてみました。

FROM roundcube/roundcubemail:1.5.3-apache

ENV COMPOSER_ALLOW_SUPERUSER=1

RUN set -ex; \
    apt update; \
    apt install -y --no-install-recommends \
        unzip \
    ; \
    sed -i "s/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/" /etc/ssl/openssl.cnf \
    ; \
    composer \
      --working-dir=/usr/src/roundcubemail/ \
      --prefer-dist \
      --prefer-stable \
      --update-no-dev \
      --no-interaction \
      --optimize-autoloader \
      require \
        boressoft/ident_switch \
    ;
 
COPY ./config.docker.add_imap_conn_options.inc.php /var/roundcube/config/

しかし、このファイルで docker build を行うと、

[ユーザ名@NAS名 myroundcube]$ docker build -f ./dockerfile.ident_switch -t jmtest .
Sending build context to Docker daemon  4.608kB
Step 1/4 : FROM roundcube/roundcubemail:1.5.3-apache
 ---> d2eac54d0366
(略)
Setting up unzip (6.0-26+deb11u1) ...
Processing triggers for mailcap (3.69) ...
+ sed -i s/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/ /etc/ssl/openssl.cnf
+ composer --working-dir=/usr/src/roundcubemail/ --prefer-dist --prefer-stable --update-no-dev --no-interaction --optimize-autoloader require boressoft/ident_switch
Info from https://repo.packagist.org: #StandWithUkraine
Using version ^4.4 for boressoft/ident_switch
./composer.json has been updated
Running composer update boressoft/ident_switch
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking boressoft/ident_switch (4.4.2)
Writing lock file
Installing dependencies from lock file
Package operations: 1 install, 0 updates, 0 removals
  - Downloading boressoft/ident_switch (4.4.2)
  - Installing boressoft/ident_switch (4.4.2): Extracting archive
Creating package config file
Running database initialization script for ident_switch
ERROR: SQLSTATE[HY000] [2002] No such file or directory
ERROR: Failed to connect to database
The command '/bin/sh -c set -ex;     apt update;     apt install -y --no-install-recommends         unzip     ;     sed -i "s/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/" /etc/ssl/openssl.cnf     ;     composer       --working-dir=/usr/src/roundcubemail/       --prefer-dist       --prefer-stable       --update-no-dev       --no-interaction       --optimize-autoloader       require         boressoft/ident_switch     ;' returned a non-zero code: 1
[ユーザ名@NAS名 myroundcube]$ 

のように、エラーが出てしまいます。どうも、インストール時に、データベースにテーブルを作るようで、docker イメージを作るタイミングだと、当然データベースがないので、インストールしても失敗してしまいます。

なので、この部分は起動後に後から手作業でインストールすることにしました。

(参考2)

Roundcube 試用の際の記事でも触れましたが、最新版 Roundcube (1.6.2) を使おうとすると、 php-zip に関するエラーが出てきます。例えば、ログインに成功した際に、コンソールに下記のようなエラーが出てきています。

errors: <73b8bb66> PHP Error: php-zip extension is required for the zipdownload plugin in /var/www/html/plugins/zipdownload/zipdownload.php on line 36 (GET /?_task=mail&_token=EDMRG9or8UJXOvuYH2p7bFOjkqOQEeGP)

いろいろとネットを見てみると、 roundcube が元にしている php のイメージ(多分 8.1.21)が持っているバグっぽいような印象です。おおもとの debian bookworm でライブラリパスがいくつか変更になったのが遠因のようです。

これの解消方法がわからなかったのと、そこまで、最新版にこだわってないので、今回は、 1.5.3-apache を元にイメージを作成することにしました。

まとめ

次は、 この作成した docker イメージを元に、 Roundcube を実際に稼働させたいと思います。