DockerのUbuntuコンテナでLAMP環境の構築をシェルスクリプトで自動化させたいです。  
以下の手順で環境構築するらしいですが、一部質問するために、省略したり、改変している部分（。。。。。にしたり）があります。

**質問項目**

  * それぞれのコードの%と$の違い
  * ②のデーモン起動 ⑧のxvfbの起動って必要な作業ですか？（起動させないと不都合があるのでしょうか）
  * ⑩⑪⑫のやっている内容が知識不足で理解できません
  * ⑤と⑬に関して、通常の手法をコード付きで教えてください（設定ファイルを別に作っておいて上書きするのか、該当部分だけ書き換えるのか）
  * dockerに関して、通常チームで開発する際、どの順序で使うのでしょうか（イメージ作る->イメージをメンバーに配る->各人がそのイメージを使ってコンテナを作成->コンテナで作業した変更内容はcommitで別イメージとして保存->ここからの流れがわかりません。また、ここまでの流れはあってますか？）どのようにして変更内容を統合させるのでしょうか(Gitで言うmerge？)

**環境構築手順**

  1. 基本システムのインストール
```     % apt-get install php composer apache2 mysql-server supervisor

    
```

  2. デーモンを起動
```     % service apache2 start

    % service supervisor start
    
```

  3. PHPの追加機能のインストール
```     % apt-get install php7.0-mysqlなど

    
```

  4. Apache module有効
```     % a2enmod ssl

    % a2enmod php7.0
    % a2enmod rewrite
    % service apache2 restart
    
```

  5. `/etc/apache2/apache2.conf`の該当部分を以下に変更
```     <Directory /var/www/>

            AllowOverride All
    </Directory>
    
```

  6. nodejsのインストール
```     % curl -sL https://deb.nodesource.com/xxxxxx.x | bash -

    % apt-get install nodejs
    
```

  7. xvfb関連ライブラリをインストール
```     % apt-get install libgtk xvfb

    
```

  8. xvfb起動
```     $ Xvfb 。。。。。。。

    
```

  9. 各種ライブラリをインストール
```     $ cd /var/www/。。。。。

    $ npm install
    $ cd /var/www/。。。。。
    $ composer install
    
```

  10. envファイルを作る
```     $ cd /var/www/。。。。。

    $ cp .env.example .env
    
```

  11. 一時フォルダのパーミッションを設定  
cdで移動し、別ディレクトリにそれぞれ設定

```     $ chmod 1777

    
```

  12. supervisorの設定（リンク？）
```     % ln -s 。。。。。。laravel-worker.conf

    
```

  13. Apacheのドキュメントルートを変更   
`/etc/apache2/sites-available/default-ssl.conf`の該当部分をいかに変更

```     DocumentRoot /var/www/。。。。。

    
```
CC BY-SA 3.0
2017-10-06T06:19:48.067
38481
2017-10-09T04:17:04.287
2017-10-09T01:27:05.933
20267
20267
question
ubuntu shellscript
DockerのUbuntuコンテナでLAMP環境の構築をシェルスクリプトで自動化させたいです
回答できるところまで書きます。

> ・それぞれのコードの%と$の違い

実行ユーザーがroot と一般ユーザーの違い。rootが％と一般ユーザー＄です。

> ・②のデーモン起動 ⑧のxvfbの起動って必要な作業ですか？（起動させないと不都合があるのでしょうか）

デーモンプログラムを起動しないと使用するときに動きません。

> ・⑩⑪⑫のやっている内容が知識不足で理解できません

⑪ chmodで実行権限を変更します。書き込みや実行できるようにします。

> ・⑤と⑬に関して、通常の手法をコード付きで教えてください（設定ファイルを別に作っておいて上書きするのか、該当部分だけ書き換えるのか）

両方とも使います。部分的な書き換えはsedコマンド、 ファイルの置き換えはcatコマンドを使用してください。  
sedについて参考になりそうなサイト  
<https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_72/com.ibm.aix.genprogc/manip_strings_sed.htm>

スクリプト全般で参考になりそうなサイト  
<http://blog.hitsujin.jp/entry/2011/03/09/140329>
CC BY-SA 3.0
2017-10-06T07:17:39.833
38483
2017-10-07T14:44:33.383
2017-10-07T14:44:33.383
25655
25655
38481
answer
シェルスクリプトで設定ファイルを作りたいのですね。  
cat を使ってファイルを作ることができます。

```

    cat <<EOF > 作成するファイル名
      ファイルの内容を記述
        ：：：：
         ：：：：
    EOF
    
```

シェルスクリプトのサンプル：

```

    #!/bin/bash
    
    # 作成するファイル名のフルパスを変数にセット
    NEW_FILE=/var/hoge/foo/bar.txt
    
    # ファイルのディレクトリを抜き出して変数にセット
    DIRECTORY="$(dirname $NEW_FILE )"
    
    # ディレクトリを作成
    mkdir -p "$DIRECTORY"
    
    # ディレクトリに移動
    cd "$DIRECTORY"
    
    # ファイルを作成 (既に有れば上書き)
    cat <<EOF > $NEW_FILE
    !! ここに設定ファイルの内容を書きます。!!
    !! 変数は次のように書くと値に展開されます。!!
    ${NEW_FILE}
    !! この↓のEOFの直前(すなわちこの行)までがファイルに書かれます。!!
    EOF
    
    # 直前のディレクトリに戻る
    cd -
    
```

実際にスクリプトを実行して、作成されたファイルを表示すると次のようになるはずです。

```

    $ bash ./sample.sh
    $ cat /var/hoge/foo/bar.txt
    !! ここに設定ファイルの内容を書きます。!!
    !! 変数は次のように書くと値に展開されます。!!
    /var/hoge/foo/bar.txt
    !! この↓のEOFの直前(すなわちこの行)までがファイルに書かれます。!!
    
```

* * *

(追記)

> ②のデーモン起動 ⑧のxvfbの起動って必要な作業ですか？（起動させないと不都合があるのでしょうか）

apache2 は起動させないと LAMP環境が動きません。  
xvfb の用途がわかりませんがたぶん、ブラウザテスト用途でしょうか。使いたいなら動かしてください。

> ⑩⑪⑫のやっている内容が知識不足で理解できません

⑩ : .env.example というファイルを /var/www/.... にコピーしてます。内容がわかりませんので .env.example
のファイルの内容を確認してみてください。  
⑪ : ディレクトリのパーミッションを設定してます。`1777`
はすべてのユーザに読み書き権限を与えますが、オーナーしか削除はできないというモードです。(スティッキービットと言います)  
⑫ : シンボリックリンクを作成しています。

> ⑤と⑬に関して、通常の手法をコード付きで教えてください（設定ファイルを別に作っておいて上書きするのか、該当部分だけ書き換えるのか）

⑤ :
色々やり方はあると思いますのでどちらが良いとも言えません。なので個人的な好みをご紹介しますと、複数行の書き換えは若干面倒くさい気もするので、設定ファイルを新規に作るのが個人的には好みです。ついでにコメントアウトも邪魔なので消しちゃいますね。

```

    cat <<EOF > /etc/apache2/apache.conf
    Mutex file:${APACHE_LOCK_DIR} default
    PidFile ${APACHE_PID_FILE}
    Timeout 300
    KeepAlive On
    MaxKeepAliveRequests 100
    KeepAliveTimeout 5
    User ${APACHE_RUN_USER}
    Group ${APACHE_RUN_GROUP}
    HostnameLookups Off
    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    IncludeOptional mods-enabled/*.load
    IncludeOptional mods-enabled/*.conf
    Include ports.conf
    <Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
    </Directory>
    <Directory /usr/share>
        AllowOverride None
        Require all granted
    </Directory>
    <Directory /var/www/>
        AllowOverride All
    </Directory>
    AccessFileName .htaccess
    <FilesMatch "^\.ht">
        Require all denied
    </FilesMatch>
    LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
    LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %O" common
    LogFormat "%{Referer}i -> %U" referer
    LogFormat "%{User-agent}i" agent
    IncludeOptional conf-enabled/*.conf
    IncludeOptional sites-enabled/*.conf
    EOF
    
```

```

    cat <<EOF > /etc/apache2/sites-available/default-ssl.conf
    <IfModule mod_ssl.c>
        <VirtualHost _default_:443>
            ServerAdmin webmaster@localhost
            ServerName 1.2.3.4:443
            DocumentRoot /var/www/...........
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
            SSLEngine on
            SSLCertificateFile /etc/apache2/ssl/apache.crt
            SSLCertificateKeyFile /etc/apache2/ssl/apache.key
            <FilesMatch "\.(cgi|shtml|phtml|php)$">
                    SSLOptions +StdEnvVars
            </FilesMatch>
            <Directory /usr/lib/cgi-bin>
                    SSLOptions +StdEnvVars
            </Directory>
            BrowserMatch "MSIE [2-6]" \
                    nokeepalive ssl-unclean-shutdown \
                    downgrade-1.0 force-response-1.0
            BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
        </VirtualHost>
        <Location /devbox>
        ProxyPass http://localhost:4200/
        </Location>
    </IfModule>
    EOF
    
```

>
> dockerに関して、通常チームで開発する際、どの順序で使うのでしょうか（イメージ作る->イメージをメンバーに配る->各人がそのイメージを使ってコンテナを作成->コンテナで作業した変更内容はcommitで別イメージとして保存->ここからの流れがわかりません。また、ここまでの流れはあってますか？）どのようにして変更内容を統合させるのでしょうか(Gitで言うmerge？)

ご自身で書かれてますが、git などのバージョン管理ソフトを使って、ブランチを分けて開発して、マージしていくのが一般的だと思います。
CC BY-SA 3.0
2017-10-06T10:47:12.240
38491
2017-10-09T04:17:04.287
2017-10-09T04:17:04.287
5008
5008
38481
answer