Dockerfileをいくつかの生成AIで修正してみた



# 概要
VScodeで使用できる生成AIが多くなってきていて盛り上がってきているため、Dpckerfileの修正をいくつかの生成AIに対して試してみる。


# 環境
#### VScode 
バージョン：1.97.0

#### 生成AI
##### AlphaCodium
VScode拡張機能名：Qodo Gen: AI Coding Assistant
バージョン：0.14.6

##### Amazon CodeWhisperer
VScode拡張機能：Amazon Q
バージョン：1.46.0

##### Copilot
VScode拡張機能：GitHub Copilot
バージョン：1.266.0

##### ChatGPT
VScode拡張機能：ChatGPT - Genie AI
バージョン：0.0.13


# 修正対象のDockerfile
```Dockerfile
FROM amazonlinux:2

COPY . /var/www/

# PHP and related functions install
RUN yum -y update \
    && yum -y install yum-utils \
    && yum -y install httpd httpd-tools \
    && amazon-linux-extras install php7.1 \
    && yum -y install php-fpm php-simplexml php-gd php-mbstring php-zip php-pdo php-mysqlnd php-bcmath \
    && yum -y install git \
    && yum clean all && rm -rf /var/cache/yum/*

RUN yum install -y install php-pear php-devel
RUN yum install -y gcc g++ make
RUN curl -Lkvf https://xdebug.org/files/xdebug-2.9.8.tgz -o xdebug-2.9.8.tgz
RUN pecl install --offline ./xdebug-2.9.8.tgz
EXPOSE 9003
# RUN docker-php-ext-enable xdebug

# RUN cp /var/www/docker/web/php.ini /etc/php.ini

# Create logs directory
RUN mkdir /logs && chmod 777 /logs

# Composer install
WORKDIR /var/www

# Install composer
RUN php composer.phar install

# Apache start
# RUN cp /var/www/docker/web/virtualhosts.conf /etc/httpd/conf.d/
RUN rm -f /etc/httpd/conf.d/welcome.conf
RUN sed -i 's|DocumentRoot "/var/www/html"|# DocumentRoot "/var/www/html"|' /etc/httpd/conf/httpd.conf
EXPOSE 80
RUN systemctl enable httpd.service

# Set bash prompt
RUN echo "PS1='[\u@\h \W]\$ '" > ~/.bashrc

# Install tar for VSCode container connection
RUN yum -y install tar
```

AmazonLinux2をベースにPHP環境を構築しているDockerfileを用いる。


# やり方
環境のところに記載した生成AIをVScodeの拡張機能でインストールしておく。
DockerfileをVScodeで開いて、開いているファイルを対象とするようにして、生成AIに「fix」とチャットを打ち、得られた結果を比較する。


# 結果
#### AlphaCodium
##### 提案してくれたファイル
```Dockerfile
FROM amazonlinux:2

# Set working directory
WORKDIR /var/www

# Copy application files
COPY . /var/www/

# Update and install necessary packages
RUN yum -y update \
    && yum -y install yum-utils httpd httpd-tools \
    && amazon-linux-extras install php7.1 \
    && yum -y install php-fpm php-simplexml php-gd php-mbstring php-zip php-pdo php-mysqlnd php-bcmath \
    && yum -y install git gcc g++ make tar \
    && yum clean all && rm -rf /var/cache/yum/*

# Install PHP extensions
RUN yum install -y php-pear php-devel \
    && curl -Lkvf https://xdebug.org/files/xdebug-2.9.8.tgz -o xdebug-2.9.8.tgz \
    && pecl install --offline ./xdebug-2.9.8.tgz \
    && rm xdebug-2.9.8.tgz

# Create logs directory with appropriate permissions
RUN mkdir /logs && chmod 777 /logs

# Install Composer
COPY composer.phar /usr/local/bin/composer
RUN php /usr/local/bin/composer install

# Configure Apache
RUN rm -f /etc/httpd/conf.d/welcome.conf \
    && sed -i 's|DocumentRoot "/var/www/html"|# DocumentRoot "/var/www/html"|' /etc/httpd/conf/httpd.conf

# Expose necessary ports
EXPOSE 80 9003

# Enable Apache service
RUN systemctl enable httpd.service

# Set bash prompt
RUN echo "PS1='[\u@\h \W]\$ '" > ~/.bashrc

# Start Apache server
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
```

##### メッセージ（日本語に翻訳している）
> 主な改善点
パッケージインストールの統合： 関連するパッケージのインストールをより少ないRUNコマンドにまとめ、Dockerイメージのレイヤ数を減らしました。
Composerのインストール： Composerがビルドコンテキストに含まれていると仮定して、コピーされたcomposer.pharファイルからインストールされるようにしました。
CMD命令： コンテナの実行時にApacheサーバーを起動するCMD命令を追加しました。
冗長なコマンドの削除： Dockerfileを効率化するために、不要なコマンドとコメントを削除しました。
コメントの改善： 各セクションの目的を明確にするためのコメントを追加しました。

##### 気づいたこと
もともとApache起動のところを試行錯誤して動くように書いていたのですが、そこを改善してくれて以下のCMDコマンドを提案してくれてたのは非常によかったと思う。
EXPOSEをまとめるなどコードを整理してくれている。


#### Amazon CodeWhisperer
##### 提案してくれたファイル
```Dockerfile
FROM amazonlinux:2

COPY . /var/www/

# PHP and Apache installation
RUN yum -y update \
    && yum -y install yum-utils \
    && yum -y install httpd httpd-tools \
    && amazon-linux-extras install php7.1 \
    && yum -y install php-fpm php-simplexml php-gd php-mbstring php-zip php-pdo php-mysqlnd php-bcmath \
    && yum -y install git php-pear php-devel gcc g++ make \
    && yum clean all && rm -rf /var/cache/yum/*

# Install Xdebug
RUN curl -Lkvf https://xdebug.org/files/xdebug-2.9.8.tgz -o xdebug-2.9.8.tgz \
    && pecl install --offline ./xdebug-2.9.8.tgz \
    && echo "zend_extension=/usr/lib64/php/modules/xdebug.so" > /etc/php.d/xdebug.ini \
    && rm xdebug-2.9.8.tgz

# Create logs directory
RUN mkdir /logs && chmod 777 /logs

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Configure Apache
RUN rm -f /etc/httpd/conf.d/welcome.conf \
    && sed -i 's|DocumentRoot "/var/www/html"|# DocumentRoot "/var/www/html"|' /etc/httpd/conf/httpd.conf

# Set working directory and install dependencies
WORKDIR /var/www
RUN composer install

# Set bash prompt
RUN echo "PS1='[\u@\h \W]\$ '" > ~/.bashrc

# Install tar for VSCode container connection
RUN yum -y install tar

# Configure entrypoint
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

EXPOSE 80 9003

ENTRYPOINT ["docker-entrypoint.sh"]
```

##### メッセージ（日本語に翻訳している）
> これはAmazon Linux 2を使用したPHP開発環境のDockerfileですね：
> 
> 1. docker-php-ext-enable xdebugコマンドはコメントアウトされており、公式のPHP Dockerイメージを使用していないため、いずれにせよ動作しません。xdebugを有効にするには、iniファイルを作成する必要があります：
> RUN echo 「zend_extension=/usr/lib64/php/modules/xdebug.so」 > /etc/php.d/xdebug.ini
> 2. Dockerコンテナはsystemdを使用しないため、コンテナではsystemctl enable httpd.serviceは機能しない。代わりに、適切なエントリーポイントスクリプトを使ってApacheを起動する必要がある。これをDockerfileに追加する：
> 
> Docker-entrypoint.sh /usr/local/bin/ をコピーする。
> RUN chmod +x /usr/local/bin/docker-entrypoint.sh
> ENTRYPOINT [「docker-entrypoint.sh」] を実行する。

##### 気づいたこと
systemdが使えないということで、シェルを用意する提案をしてくれたが、冗長に思う。
EXPOSEをまとめるなどコードを整理してくれている。


#### Copilot
##### 提案してくれたファイル
```Dockerfile
FROM amazonlinux:2

# Copy application files to the container
COPY . /var/www/

# PHP and related functions install
RUN yum -y update \
    && yum -y install yum-utils \
    && yum -y install httpd httpd-tools \
    && amazon-linux-extras install php7.1 \
    && yum -y install php-fpm php-simplexml php-gd php-mbstring php-zip php-pdo php-mysqlnd php-bcmath \
    && yum -y install git \
    && yum clean all && rm -rf /var/cache/yum/*

RUN yum install -y php-pear php-devel
RUN yum install -y gcc g++ make
RUN curl -Lkvf https://xdebug.org/files/xdebug-2.9.8.tgz -o xdebug-2.9.8.tgz
RUN pecl install --offline ./xdebug-2.9.8.tgz
EXPOSE 9003
# RUN docker-php-ext-enable xdebug

# Create logs directory
RUN mkdir /logs && chmod 777 /logs

# Set working directory
WORKDIR /var/www

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer

# Run Composer install
RUN composer install --no-scripts --no-autoloader

# Generate optimized autoloader
RUN composer dump-autoload --optimize

# Install and configure locale
RUN yum -y install glibc-locale-source glibc-langpack-ja \
    && localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 \
    && echo 'LANG="ja_JP.UTF-8"' > /etc/locale.conf \
    && echo 'export LANG=ja_JP.UTF-8' >> /etc/profile.d/locale.sh

# Apache start
# RUN cp /var/www/docker/web/virtualhosts.conf /etc/httpd/conf.d/
RUN rm -f /etc/httpd/conf.d/welcome.conf
RUN sed -i 's|DocumentRoot "/var/www/html"|# DocumentRoot "/var/www/html"|' /etc/httpd/conf/httpd.conf
EXPOSE 80
RUN systemctl enable httpd.service

# Set bash prompt
RUN echo "PS1='[\u@\h \W]\$ '" > ~/.bashrc

# Install tar for VSCode container connection
RUN yum -y install tar
```

##### メッセージ（日本語に翻訳している）
> 変更点
> 
> 1. COPY . /を追加し、composer.jsonを含むすべてのアプリケーションファイルを/var/wwwディレクトリにコピーするようにした。
> 2. Composerコマンドを実行する前にWORKDIR /var/wwwコマンドを移動し、正しい作業ディレクトリを確保。
> 3. Composerをインストールし、/usr/local/bin/composerに移動。
> 4. composer installコマンドとcomposer dump-autoloadコマンドを実行して、依存関係をインストールし、最適化されたオートローダーを生成した。
> 5. 日本語ロケールに対応するため、glibc-locale-sourceとglibc-langpack-jaパッケージのインストールを追加した。
> 6. localedefを使ってja_JP.UTF-8ロケールを設定。
> 7. /etc/locale.confを更新し、LANGをエクスポートしてデフォルトのロケールを設定する。
> これで、ja_JP.utf8 ロケールがインストールされ、Composer が正しくインストールされ、Docker コンテナで実行されるはずです。さらに問題が発生した場合は、詳細なエラーメッセージを提供してください。

##### 気づいたこと
ロケールのことを気にしてくれて、ロケールに関する設定を追加してくれているのは他の生成AIになかったところ。
コードの整理は特にしてくれていない。


#### ChatGPT
##### 提案してくれたファイル
```Dockerfile
FROM amazonlinux:2

# Set working directory
WORKDIR /var/www/

# Copy application files
COPY . .

# Install PHP and related functions
RUN yum -y update \
    && yum -y install yum-utils httpd httpd-tools git gcc g++ make tar \
    && amazon-linux-extras install php7.1 \
    && yum -y install php-fpm php-simplexml php-gd php-mbstring php-zip php-pdo php-mysqlnd php-bcmath php-pear php-devel \
    && curl -Lkvf https://xdebug.org/files/xdebug-2.9.8.tgz -o xdebug-2.9.8.tgz \
    && pecl install --offline ./xdebug-2.9.8.tgz \
    && rm xdebug-2.9.8.tgz \
    && yum clean all \
    && rm -rf /var/cache/yum/*

# Configure Apache
RUN rm -f /etc/httpd/conf.d/welcome.conf \
    && sed -i 's|DocumentRoot "/var/www/html"|# DocumentRoot "/var/www/html"|' /etc/httpd/conf/httpd.conf \
    && systemctl enable httpd.service

# Create logs directory with appropriate permissions
RUN mkdir /logs && chmod 777 /logs

# Install composer dependencies
RUN php composer.phar install

# Set bash prompt
RUN echo "PS1='[\u@\h \W]\$ '" > ~/.bashrc

EXPOSE 80 9003

```

##### メッセージ（日本語に翻訳している）
> 主な改善点
> 1. コマンドの統合： 類似のyumインストールコマンドを1つのRUN命令に統合し、階層数を減らしました。
> 
> 2. 一時ファイルの削除： インストール後にダウンロードした Xdebug の tarball を削除し、イメージサイズを小さくしました。
> 
> 3. レイヤーの最小化： 設定変更（Apacheの設定など）を既存のRUN命令に統合することで、レイヤーを最小化しました。
> 
> 注意事項
> composer.pharがインストール用にコピーされるコンテキストに存在することを確認してください。
アプリケーションに必要な、以前にコメントしたコマンド（RUN や COPY）が正しく含まれていることを確認してください。必要に応じてパスを調整し、php.iniや.htaccessのコピーなどのコマンドが正確であることを確認します。
コンテナを徹底的にテストして、最適化後もすべての機能が期待どおりに動作することを確認します。

##### 気づいたこと
EXPOSEをまとめるなどコードを整理してくれている。
WORKDIRを上に持ってきて、COPY . .にしてくれていて、（可読性は置いておいて）コードを読み解いた改良をしてくれている。


# まとめ
各生成AIはそれぞれ違った結果の修正提案をしてくれた。
微妙な違いだけだが、一長一短はありそう。

個人的には、Copilotがロケールの提案もしてくれたので使っていこうと思った。