概要
php のプロジェクトに CircleCI を導入した。
PHP の拡張(特に grpc 拡張)のインストールに時間がかかるため、独自イメージを用意してそれを使うことにした。
イメージの管理には Amazon Elastic Container Registry (ECR) を使ってみた。
ECR でリポジトリの作成
ECR でリポジトリを作成する。
とりあえず myphp
みたいな名前にするが、名前空間も作れる ( grpc/php
みたいに)。
他にタグの上書きを禁止したり、脆弱性診断のスキャンをする設定もある。
Dockerfile の作成
FROM circleci/php:7.1.32-fpm-stretch # install grpc-extension RUN set -x \ && sudo pecl install grpc \ && sudo docker-php-ext-enable grpc CMD ["/bin/sh"]
CircleCI のイメージをベースに、 grpc 拡張をインストールした後、有効化している。
Dockerfile のビルド
ビルドする。
docker image build -t myphp:7.1.32-fpm-stretch .
ECR 用のタグを作成する。
docker tag myphp:7.1.32-fpm-stretch \ ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/myphp:7.1.32-fpm-stretch
アカウント ID や リージョンは適宜置き換える。
ECR に push
ECR にログインする。
get-login
がログインコマンドを返してくれるので、そのまま実行可能。
$(aws ecr get-login --region ${AWS_REGION} --no-include-email)
ECR に push する。
docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/myphp:7.1.32-fpm-stretch
list-images
でイメージの一覧を確認可能。
aws ecr list-images --repository-name myphp
CircleCI からの利用
Image はこんな感じで利用できる。
AWS_ACCESS_KEY_ID
や AWS_SECRET_ACCESS_KEY
は CircleCI 側で環境変数に入れておく。
docker: - image: ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/myphp:7.1.32-fpm-grpc aws_auth: aws_access_key_id: ${AWS_ACCESS_KEY_ID} aws_secret_access_key: ${AWS_SECRET_ACCESS_KEY}
circleci の CLI で試すならこんな感じ
circleci build \ -e AWS_ACCOUNT_ID=XXXX \ -e AWS_REGION=ap-northeast-1 \ -e AWS_ACCESS_KEY_ID=XXXX \ -e AWS_SECRET_ACCESS_KEY=XXXX
CI であれば、読み取り用の権限だけで動く。
- ecr:GetAuthorizationToken
- ecr:BatchCheckLayerAvailability
- ecr:GetDownloadUrlForLayer
- ecr:GetRepositoryPolicy
- ecr:DescribeRepositories
- ecr:ListImages
- ecr:DescribeImages
- ecr:BatchGetImage
あたり。
補足
grpc のイメージは現状メンテナンスされていないようだった。