DockerFileのRUNの書き方について

今日、久々Dockerfileを修正する機会があったのでRUNの使い方について考えてみました。

# 修正内容
先ずはGit情報を拝見しましょう！

```
{{省略}}
-RUN touch /etc/supervisord.d/supervisord-ssh.ini
-RUN echo '[program:sshd]' >> /etc/supervisord.d/supervisord-ssh.ini
-RUN echo 'command=systemctl start sshd' >> /etc/supervisord.d/supervisord-ssh.ini
-RUN touch /etc/supervisord.d/supervisord-httpd.ini
-RUN echo '[program:apache]' >> /etc/supervisord.d/supervisord-httpd.ini
-RUN echo 'command=systemctl start httpd' >> /etc/supervisord.d/supervisord-httpd.ini
-RUN touch /etc/supervisord.d/supervisord-postfix.ini
-RUN echo '[program:postfix]' >> /etc/supervisord.d/supervisord-postfix.ini
-RUN echo 'command=systemctl start postfix' >> /etc/supervisord.d/supervisord-postfix.ini
+RUN touch /etc/supervisord.d/supervisord-ssh.ini && \
+    echo '[program:sshd]' >> /etc/supervisord.d/supervisord-ssh.ini && \
+    echo 'command=systemctl start sshd' >> /etc/supervisord.d/supervisord-ssh.ini
+RUN touch /etc/supervisord.d/supervisord-httpd.ini && \
+    echo '[program:apache]' >> /etc/supervisord.d/supervisord-httpd.ini && \
+    echo 'command=systemctl start httpd' >> /etc/supervisord.d/supervisord-httpd.ini
+RUN touch /etc/supervisord.d/supervisord-postfix.ini && \
+    echo '[program:postfix]' >> /etc/supervisord.d/supervisord-postfix.ini && \
+    echo 'command=systemctl start postfix' >> /etc/supervisord.d/supervisord-postfix.ini
{{省略}}
```
会社で利用しているあるシステムでsupervisorの設定するところです。

## 試してやってみた
修正する前のをbuildするとこんな感じです。

```
{{省略}}
Step 92/119 : RUN touch /etc/supervisord.d/supervisord-ssh.ini
 ---> Using cache
 ---> 0ddb7a813a65
Step 93/119 : RUN echo '[program:sshd]' >> /etc/supervisord.d/supervisord-ssh.ini
 ---> Using cache
 ---> 21cd6ebe1167
Step 94/119 : RUN echo 'command=systemctl start sshd' >> /etc/supervisord.d/supervisord-ssh.ini
 ---> Using cache
 ---> 434845fe82d0
Step 95/119 : RUN touch /etc/supervisord.d/supervisord-httpd.ini
 ---> Using cache
 ---> e57105560e27
Step 96/119 : RUN echo '[program:apache]' >> /etc/supervisord.d/supervisord-httpd.ini
 ---> Using cache
 ---> 6fd0ca2244a9
Step 97/119 : RUN echo 'command=systemctl start httpd' >> /etc/supervisord.d/supervisord-httpd.ini
 ---> Using cache
 ---> 9b2dcbe3ee8d
Step 98/119 : RUN touch /etc/supervisord.d/supervisord-postfix.ini
 ---> Using cache
 ---> 1ec96761d553
Step 99/119 : RUN echo '[program:postfix]' >> /etc/supervisord.d/supervisord-postfix.ini
 ---> Using cache
 ---> a3ca97d35adf
Step 100/119 : RUN echo 'command=systemctl start postfix' >> /etc/supervisord.d/supervisord-postfix.ini
 ---> Using cache
 ---> e7917a3d45a7
{{省略}}
```
RUNことにBuild中のImage（？）と通信（？）＆Cache作成を行い、すごく時間がかかります（自分がせっかちではあり）。それでこんな感じで修正してみます。

```
RUN sed -i -e 's/^user = nobody/user = apache/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf && sed -i -e 's/^group = nobody/group = apache/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf && sed -i -e 's/^listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm7.1.20.sock/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf && sed -i -e 's/^;listen.owner = nobody/listen.owner = apache/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf && sed -i -e 's/^;listen.group = nobody/listen.group = apache/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf
```
一行にやると可読性が落ちますね。それで最終的にはこんな感じです。

```
RUN sed -i -e 's/^user = nobody/user = apache/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^group = nobody/group = apache/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm7.1.20.sock/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^;listen.owner = nobody/listen.owner = apache/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^;listen.group = nobody/listen.group = apache/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf
```
**「&& \」**これ大事！！！
## RUNを使うべき時
上記にも書いてますが、RUNが実行されるとCacheが登録されます。これが大事でBuildした後にVersionアップや設定の修正になった場合、その前までのCacheを利用したい場合利用すれば良いです。

個人的には何かのインストールは必ずRUNを別にする感じですかね。

> 興味がある方はこちらへ
> [Laravel + Docker + 開発環境](https://fatty-rabbit.tistory.com/category/Laravel%20%2B%20Docker%20%2B%20%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83)