10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Docker環境でcomposerのimageつかってupdateしてみる

Last updated at Posted at 2019-09-24

docker環境で、composerを使用する場合、phpのDockerfile内でcomposerコマンドをインストールして、composer installや、composer updateしてる人多いと思いますが(僕もそうでした。。)、composerのイメージが存在するので、今回はcomposer updateだけをするコンテナ作って動かしてみました。

構成

mac OS Mojave
php:7.3-apache
composer:1.9.0

まずは、完成したものからみてみる

ディレクトリ構成

docker/php/Dockerfile これ、正直docker-compose.ymlだけで表現できる内容なのですが、実際の現場だとDockerfile内にいろいろ記述するケースが多いので、わざわざファイル作ってます。

$ tree
.
├── app
│   └── composer.json
├── docker
│   └── php
│       └── Dockerfile
└── docker-compose.yml

docker-compose.yml

docker-compose.yml
version: "3.3"

services:
  php:
    build: ./docker/php
    volumes:
      - ./app:/var/www/html/
    ports:
      - "8010:80"
  composer:
    image: composer:1.9.0
    command: 'composer update'
    volumes: 
      - ./app:/app
    links:
      - php

docker/php/Dockerfile

FROM php:7.3-apache

CMD ["apache2-foreground"]

実際に動かしてみる

上記のdocker composeファイルを使って実際に起動してみましょう。

composer.jsonをつくる

appフォルダにcdして、composer.jsonを作成しましょう。
composer initすると対話形式でいろいろ聞かれますが、今回は基本デフォルトのままで作成します。

$ cd app
$ composer init

                                            
  Welcome to the Composer config generator  
                                            


This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [yuya.sega/app]: php-composer/docker
Description []: composerをdockerイメージ使ってupdateする
Author [yuya.sega <sega@sorich.jp>, n to skip]: 
Minimum Stability []: 
Package Type (e.g. library, project, metapackage, composer-plugin) []: 
License []: 

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? 
Search for a package: 
Would you like to define your dev dependencies (require-dev) interactively [yes]? 
Search for a package: 

{
    "name": "php-composer/docker",
    "description": "composerをdockerイメージ使ってupdateする",
    "authors": [
        {
            "name": "yuya.sega",
            "email": "sega@sorich.jp"
        }
    ],
    "require": {}
}

Do you confirm generation [yes]? 

そうすると、app/composer.jsonが作成されます。

composerでおとしてくるライブラリをかく

試しに、laravelフレームワークをcomposerでおとしてくるようにcomposer.jsonを書き換えます。
実際に書き換えたのは、requireのlaravel/framework": "6.0.*としている部分だけです。

{
    "name": "php-composer/docker",
    "description": "composerをdockerイメージ使ってupdateする",
    "authors": [
        {
            "name": "yuya.sega",
            "email": "sega@sorich.jp"
        }
    ],
    "require": {
        "laravel/framework": "6.0.*"
    }
}

よし、upする。

$ docker-compose build && docker-compose up
Building php
Step 1/2 : FROM php:7.3-apache
 ---> 406c73effb13
Step 2/2 : CMD ["apache2-foreground"]
 ---> Using cache
 ---> 832fb1c3e525

Successfully built 832fb1c3e525
Successfully tagged php-composer_php:latest
Creating network "php-composer_default" with the default driver
Creating php-composer_php_1 ... done
Creating php-composer_composer_1 ... done
Attaching to php-composer_php_1, php-composer_composer_1
php_1       | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.176.2. Set the 'ServerName' directive globally to suppress this message
php_1       | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.176.2. Set the 'ServerName' directive globally to suppress this message
php_1       | [Tue Sep 24 02:52:09.788930 2019] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.25 (Debian) PHP/7.3.3 configured -- resuming normal operations
php_1       | [Tue Sep 24 02:52:09.789086 2019] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
composer_1  | Loading composer repositories with package information
composer_1  | Updating dependencies (including require-dev)
composer_1  | Package operations: 40 installs, 0 updates, 0 removals
composer_1  |   - Installing symfony/polyfill-ctype (v1.12.0): Downloading (100%)  

~~ 略 ~~

composer_1  | Writing lock file
composer_1  | Generating autoload files
php-composer_composer_1 exited with code 0

exit codeが0で正常終了しましたね。

立ち上がったコンテナをpsしてみると、たしかにcomposerのコンテナは終了してますので、以後の動作が遅くなったり重くなったりしなくていいですね

$ docker-compose ps
         Name                        Command               State           Ports        
----------------------------------------------------------------------------------------
php-composer_composer_1   /bin/sh /docker-entrypoint ...   Exit 0                       
php-composer_php_1        docker-php-entrypoint apac ...   Up       0.0.0.0:8010->80/tcp

少し解説

docker-compose.yml#composer:

実際にcomposerでしたいことをdocker-compose.yml内のcommandに記述してます。
もちろんupdateだけでなくinstallや、他のコマンドも指定できます。

command: 'composer update'

さいごに

いままで、phpコンテナのDockerfileにcomposerコマンドのインストール等を行ってました。
ですがcomposer専用のコンテナを用意し、実行することで、Dockerfileもスッキリして気持ちいいし、buildも実際早くなってると思うので、みなさんも是非やってみて欲しいです。

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?