質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

7528閲覧

Dockerfile内でcomposer installしたい

ginuser

総合スコア13

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

1クリップ

投稿2019/07/29 14:07

Docker初心者です。

現在以下のようなDockerfileを作成し、docker-composeの際にローカルからコンテナにマウントしたcomposer.jsonを使ってライブラリを導入したいと考えているのですが、どうしても最後のcomposer installのところでこけてしまってうまくいきません。

Dockerfile

1FROM centos:7 2 3RUN yum -y update 4RUN yum -y install epel-release 5RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 6RUN yum -y --enablerepo=remi,remi-php72 install \ 7 httpd \ 8 php \ 9 php-cli \ 10 php-common \ 11 php-mbstring \ 12 php-xml \ 13 php-xmlrpc 14 15RUN ln -sf /etc/mime.types /etc/httpd/conf/mime.types 16 17RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime 18 19# Git Install 20RUN yum install -y wget 21RUN cd /etc/yum.repos.d/ 22RUN yum install -y git 23 24RUN yum install -y zip unzip 25 26# Composer Install 27RUN cd /var/www/html 28RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" 29RUN php composer-setup.php 30RUN php -r "unlink('composer-setup.php');" 31RUN mv composer.phar /usr/local/bin/composer 32COPY composer.json /var/www/html/composer.json 33RUN cd /var/www/html 34RUN composer install 35CMD ["/usr/sbin/httpd","-D","FOREGROUND"] 36

dockercomposeyml

1version: "3" 2services: 3 app: 4 build: 5 context: ./ 6 dockerfile: ./docker/Dockerfile 7 ports: 8 - 80:80 9 volumes: 10 - "./src/:/var/www/html" 11 - "./docker/httpd.conf:/etc/httpd/conf/httpd.conf" 12volumes: 13 storage: 14

docker-composeの際の指定ディレクトリと同階層にsrc/composer.jsonを置いている構成です。
以下のcomposer.jsonをコンテナにマウントしてcomposer installしたいのですが、

composerjson

1{ 2 "require": { 3 "aws/aws-sdk-php": "^3.82" 4 } 5} 6

最後に以下のエラーでcomposer installは実行されません。

cmd

1Composer could not find a composer.json file in / 2To initialize a project, please create a composer.json file as described in the https://getcomposer.org/ "Getting Started" section 3ERROR: Service 'app' failed to build: The command '/bin/sh -c composer install' returned a non-zero code: 1 4

ローカルマシンはMacOSXです。

書き方以前に、上記のような方法では難しいということでしょうか?

お解りになる方、どうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

端的にいうとDocikerfile内でcdを使っているからです。

RUN cd /var/www/html

このコードはもはや意味を持ちません。
RUN でcdしても、cdした結果は次のRUNに保持されません。

cdした状態で何かをしたい場合は && でコマンドを繋げて書くか
WORKDIR で作業ディレクトリを指定しましょう(これは次のRUNに引き継がれる)


上記の結果、composer.jsonが見つからない、と言われているのでしょう

投稿2019/07/29 15:02

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikkame

2019/07/29 15:06

完成状態で配布するならわかるんですが 基本的にdockerfile内でcomposer installまでやるのはあまりお勧めしません。 パッケージの追加が行われる時にリビルドする必要があるためです。 例えばPHPの勉強を目的に使用する、とかであればcomposerコマンドのインストールぐらいにしておいて(本当はこれもcomposer.pharを含めた作業ディレクトリをマウントしてあげれば不要なのだが) docker-compose run か exec でinstallするでいいんじゃないかと思います
ginuser

2019/07/29 16:10 編集

回答ありがとうございます。 "&& でコマンドを繋げて書くか WORKDIR で作業ディレクトリを指定" 確かにこれでcomposer installが実行されました! ただ肝心のvendor/*が出来ておりません。依存ライブラリも含めて全て100%インストールが行われたコマンドが流れてはいるのですが... execでコンテナにログインし、composer installすれば全く問題なくvendor/*も.lockも生成されます。 仰る通り、毎回リビルドが走るのはスマートじゃないですね... 今調べていたらcomposerのimageがあるという記事を見つけました。 https://qiita.com/PitPat/items/dc1ad09f7936b8825473 ホストにcomposerがインストールされていない環境の配布用途へはこちらをイメージをrunして使用し、普段個人的な練習、開発用途ではホスト側で構築したソースをマウントすることにします。 色々と知識が得られて有益でした。ありがとうございました。
mikkame

2019/07/29 17:46 編集

vendorがないっていうのは docker-composeでsrcを/var/www/htmlにマウントしてるからだと思いますよ なので > 完成状態で配布するならわかるんですが > 基本的にdockerfile内でcomposer installまでやるのはあまりお勧めしません。 という感じです。一般的ではないです /var/www/vendorにしてsrcから../vendor/autoload.phpのように繋げればdocker内のvendorが使えますが、めんどいですよね
mikkame

2019/07/29 17:56

そもそもこの内容ならcentosからではなくphpをfromにした方が無難な感じがします
ginuser

2019/07/30 12:13

> docker-composeでsrcを/var/www/htmlにマウントしてるからだと思いますよ 確かに言われて見ればそうですね!うっかりしてました。 マウントする階層以下とは別のディレクトリでvendor/*を生成してからmvするのはいかにもわざとらしいですし、かといってソースの方をいじるのも違和感がありますね。 ありがとうございます。 仰る通り、phpのimageからコンテナ作るようにしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問