web-dev-qa-db-ja.com

composer(php依存関係マネージャー))を取得して、Dockerイメージビルドで実行します

注:私はこの環境を使用しなくなったため、答えをテストして受け入れる方法はありません。ごめんなさい。

TL; DRcomposerを使用してPHP依存関係を処理するdockerイメージの例を教えてください。

この投稿の私の質問はすべて、composer php依存関係ツールに関するものですnotdocker-composerfigの後継。

composer依存関係としてインストールされたwordpress を実行するために、独自のdockerイメージを構築しようとしています。

私はdocker php imageをベースとして使用してdocker imageの構築に取り組んでいます。私がする必要があるのは、composerをインストールし、イメージの作成時またはイメージのビルド時にcomposer更新コマンドを実行することです(両方とも大丈夫かどうかわからない)。

すべてのステップを手動で実行することで、すべて正常に実行できます(Dockerイメージの実行、バッシング、各ステップのコピーと貼り付け)。

しかし、そのすべてのステップをDockerfileに配置しても、composerにファイルを書き込むことはできません。

私はしばらくの間、最小の失敗例を得ようと試みてきましたが、私が持っているものは全く最小ではありません。

私のテストは以下で構成されています(以下の関連するgithubリポジトリへのリンク)

Dockerfile

NFORMATION ~~~#

# based on
# https://hub.docker.com/r/richarvey/nginx-php-fpm/
# and
# https://hub.docker.com/_/wordpress/

FROM php:7.0.2-Apache

MAINTAINER Miquel Adell <[email protected]>

ENV WORDPRESS_VERSION 4.4.1



#~~~ DEPENDENCIES ~~~#

# Add PHP repository to apt source
RUN apt-get update \
    && apt-get install -y \
        libpng12-dev \
        libjpeg-dev  \
        curl \
        sed \
        zlib1g-dev \
    && docker-php-ext-install \
        Zip \
        mysqli

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



#~~~ DIRS ~~~#

WORKDIR /var/www/html/



#~~~ WORDPRESS ~~~#

COPY files/composer.json composer.json
ONBUILD RUN composer update

docker-compose.yml

wordpress:
  image: miqueladell/composed_wordpress_test
  links:
    - wordpress_db:mysql
  environment:
    - VIRTUAL_Host=miqueladell.dev
    - WORDPRESS_DB_NAME=wordpress
  ports:
   - "80"

wordpress_db:
  image: miqueladell/mariadb-utf8mb4
  environment:
     - MYSQL_ROOT_PASSWORD=password

私のテストは次のとおりです

  1. 上記で貼り付けたDockerfileを含むディレクトリにこのコマンドを実行するイメージを構築します

    docker build -t miqueladell/composed_wordpress_test .
    

    (ログにエラーなし)

  2. 上記の貼り付けられたdocker-compose.ymlを含むディレクトリで次のコマンドを実行して、そのイメージを使用してコンテナを構築します

    docker-compose up
    

    (ログにエラーなし)

  3. 実行中のコンテナにbashして、ファイルがそこにあるかどうかを確認できます

    docker exec -i -t miqueladellv2_wordpress_1 bash
    
  4. / var/www/htmlのls

    root@bff14367658b:/var/www/html# ls -al
    total 12
    drwxr-xr-x 2 www-data www-data 4096 Jan 19 10:50 .
    drwxr-xr-x 5 root     root     4096 Jan 19 10:50 ..
    -rw-r--r-- 1 root     root      138 Jan 15 09:18 composer.json
    

ステップ4で、composer updateがまったく実行されていないように見えることがわかります。

私は両方を使ってみました

RUN composer update

そして

ONBUILD RUN composer update

dockerfileで同じ結果が得られます。

テストの前のステップ4に戻り、ドッカーコンテナーのbashプロンプトでcomposer updateを手動で実行すると、次のようになります。

root@bff14367658b:/var/www/html# composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing johnpbloch/wordpress-core-installer (0.2.1)
    Downloading: 100%

  - Installing johnpbloch/wordpress (4.4.1)
    Downloading: 100%

Writing lock file
Generating autoload files
root@bff14367658b:/var/www/html# ls -al
total 24
drwxr-xr-x 4 www-data www-data 4096 Jan 19 11:12 .
drwxr-xr-x 6 root     root     4096 Jan 19 11:12 ..
-rw-r--r-- 1 root     root      138 Jan 15 09:18 composer.json
-rw-r--r-- 1 root     root     3718 Jan 19 11:12 composer.lock
drwxr-xr-x 4 root     root     4096 Jan 19 11:12 vendor
drwxr-xr-x 5 root     root     4096 Jan 19 11:12 wordpress
root@bff14367658b:/var/www/html#

これは、まさにステップ4で期待していた出力です

アドバイスをお願いします。ありがとう。

完全なファイルへのgithubリンク

33
Miquel Adell

composer=をインストールすると、この問題を回避できます。

RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \
&& curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig \
# Make sure we're installing what we think we're installing!
&& php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" \
&& php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer --snapshot \
&& rm -f /tmp/composer-setup.*
24
Brian Wood

今日、この問題に遭遇しました。

私にとってそれを解決したのは、イメージで定義されたディレクトリとは異なるディレクトリを使用することでした。

ディレクトリがボリュームとして定義されている場合、ビルドプロセス中にディレクトリに加えられた変更は破棄されるようです。

作業中のDockerfileの例を次に示します

FROM richarvey/nginx-php-fpm

# Install dependencies
RUN apt-get update && \
    apt-get install curl nano && \
    curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add update nginx config
COPY conf/nginx-site.conf /etc/nginx/sites-available/default.conf

# Bundle app source 
COPY app/ /app

# Install app dependencies
RUN cd /app && \
    composer install --no-interaction 

EXPOSE 80

そして、conf/nginx-site.confアプリケーションのルートを更新しました(簡潔にするために短縮)

server {
    # ... the rest of your nginx config

    root /app/public;

    # ... the rest of your nginx config
}
20
bmagg