Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CloudBuildで docker-composeとansibleを使っている話
Search
Ikuo Kumagai
October 01, 2019
Technology
1
1.5k
CloudBuildで docker-composeとansibleを使っている話
Google Cloud Build Day で発表
https://gcpug-tokyo.connpass.com/event/143453/
Ikuo Kumagai
October 01, 2019
Tweet
Share
More Decks by Ikuo Kumagai
See All by Ikuo Kumagai
プロダクト運用のCloudOps化に伴うジレンマ
kumagai19o
0
250
Ansible から Docker への実践記
kumagai19o
0
130
Other Decks in Technology
See All in Technology
Yamla: Rustでつくるリアルタイム性を追求した機械学習基盤 / Yamla: A Rust-Based Machine Learning Platform Pursuing Real-Time Capabilities
lycorptech_jp
PRO
3
120
rubygem開発で鍛える設計力
joker1007
2
210
AWS テクニカルサポートとエンドカスタマーの中間地点から見えるより良いサポートの活用方法
kazzpapa3
2
550
ひとり情シスなCTOがLLMと始めるオペレーション最適化 / CTO's LLM-Powered Ops
yamitzky
0
440
Node-RED × MCP 勉強会 vol.1
1ftseabass
PRO
0
150
2025-06-26_Lightning_Talk_for_Lightning_Talks
_hashimo2
2
100
Javaで作る RAGを活用した Q&Aアプリケーション
recruitengineers
PRO
1
110
OpenHands🤲にContributeしてみた
kotauchisunsun
1
460
セキュリティの民主化は何故必要なのか_AWS WAF 運用の 10 の苦悩から学ぶ
yoh
1
170
フィンテック養成勉強会#54
finengine
0
180
標準技術と独自システムで作る「つらくない」SaaS アカウント管理 / Effortless SaaS Account Management with Standard Technologies & Custom Systems
yuyatakeyama
3
1.3k
AIとともに進化するエンジニアリング / Engineering-Evolving-with-AI_final.pdf
lycorptech_jp
PRO
0
110
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
700
Site-Speed That Sticks
csswizardry
10
660
Raft: Consensus for Rubyists
vanstee
140
7k
A designer walks into a library…
pauljervisheath
207
24k
A Modern Web Designer's Workflow
chriscoyier
694
190k
Mobile First: as difficult as doing things right
swwweet
223
9.7k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.5k
Code Reviewing Like a Champion
maltzj
524
40k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
Side Projects
sachag
455
42k
Statistics for Hackers
jakevdp
799
220k
Balancing Empowerment & Direction
lara
1
380
Transcript
CloudBuild 内で docker-composeと ansibleで buildとCIしている話 1
AXLBIT Inc. • 開発環境でのみGCPを利⽤しています。 • 先⽉のBuild Timeは24,871.67 minutes です 弊社の状況
2
AXLBIT Inc. • Ansible playbookで環境構築が⾃動化されている既存の 運⽤プロセスがあった。 背景(Cloud Build 以前 )
3 Deploy anywhere! No problem!
AXLBIT Inc. • Ansible で DockerコンテナにDeployして commit • OS初期状態のコンテナにAnsible で
Deploy • できたコンテナをイメージ化 Step1 Docker Image Build 4 デプロイ via Docker イメージ化 動作環境 コンテナ docker commit
AXLBIT Inc. • 最初はAnsible実⾏時のOSの初期状態だけを作成 • AnsibleからOSの初期設定をしている部分などはここに いれる } Yum update
& reboot -> 最新のOSイメージを使ってリビルド } タイムゾーンの設定、localeの設定 … Base のDockerfileには最低限だけ 5 FROM centos:7 RUN yum -y update ¥ && yum -y install epel-release ¥ && yum -y update ¥ && yum -y install initscripts MAKEDEV git bc ansible syslog¥ && yum install -y yum-utils device-mapper-persistent-data lvm2 ¥ RUN localedef -v -c -i ja_JP -f UTF-8 ja_JP.UTF-8; echo ""; env LANG=ja_JP.UTF-8 RUN unlink /etc/localtime RUN ln -s /usr/share/zoneinfo/Japan /etc/localtime WORKDIR /root/deploy ENTRYPOINT ["/root/deploy/init.sh"]
AXLBIT Inc. • AnsibleでDockerにDeployするからといって、初期イ メージにSSHをインストールしなくて良い。 } Hosts で ansible_connection=docker とすればDockerコマンド
でデプロイ Ansible Docker Connection 6 [axlgear] axlgear ansible_connection=docker #Ansible 実⾏環境でDockerコマンドを実⾏した時に接続される環境のdockerコンテナを指定
AXLBIT Inc. • VM内でAnsible 実⾏をコンテナで実⾏ } -> イメージ作成 docker-composeでansible実⾏ 7
デプロイ via docker 動作環境 コンテナ 動作環境 コンテナ VM
AXLBIT Inc. • Docker composeと ansibleが実⾏できるイメージ作成 } CloudBuildersイメージには Ansible⼊っていないので⾃作 ⾃作
docker-compose & ansible イメージ 8 FROM centos:7 RUN yum -y update ¥ && yum -y install epel-release ¥ && yum -y update ¥ && yum -y install initscripts MAKEDEV git bc ansible syslog¥ && yum install -y yum-utils device-mapper-persistent-data lvm2 ¥ && yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ¥ && yum install -y docker-ce ¥ && yum check ¥ && curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) - o /usr/local/bin/docker-compose ¥ && chmod +x /usr/local/bin/docker-compose RUN localedef -v -c -i ja_JP -f UTF-8 ja_JP.UTF-8; echo ""; env LANG=ja_JP.UTF-8 RUN unlink /etc/localtime RUN ln -s /usr/share/zoneinfo/Japan /etc/localtime VOLUME /var/lib/docker EXPOSE 2375 WORKDIR /root/deploy ENTRYPOINT ["/root/deploy/init.sh"]
AXLBIT Inc. • docker-compose.yml [Tips] イメージ作成の⾃動化 9 version: '3' services:
deploy: # default global_env link to .env # if you change local_env 'ln -s local_env .env' image: ${DEPLOY_BASE} command: ./${DEPLOY_COMMAND} common.conf difference-gear-base.conf environment: - COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME} - DAEMON=${DAEMON_FLG} volumes: - ./:/root/deploy:z - /var/run/docker.sock:/var/run/docker.sock - ~/.ssh:/root/host_keys:ro - ../settings:/root/work/:Z - ../dep-opt:/opt/:Z gear-body: #image: ${GEAR_BASE} #volumes: # - ../opt:/opt/:Z image: ${DEPLOYED_GEAR} #デプロイ済みイメージを使う場合 volumes: - ../work:/root/container #デプロイ済みイメージを使う場合のファイル共有⽤ ports: - "443"
AXLBIT Inc. ここでCloudBuild とかやってた。 10
AXLBIT Inc. • VM内でAnsible 実⾏をコンテナで実⾏ } -> イメージ作成 docker-composeでansible実⾏ 11
デプロイ via docker 動作環境 コンテナ 動作環境 コンテナ CloudBuild
AXLBIT Inc. • docker-composeで構築対象イメージを起動 } -> その後 ansibleイメージを実⾏ とりあえず構築をCloudBuild化 12
- name: 'gcr.io/sixth-hash-162208/deploy-base' env: - 'COMPOSE_PROJECT_NAME=buildimage' - 'BRANCH_NAME=$BRANCH_NAME' entrypoint: 'bash' args: - '-c' - | set -xe #これは各test-addon側のファイルを置く cp /root/.ssh/* $_CLOUD_BUILD_DIR/.ssh/ cd $_CLOUD_BUILD_DIR/makeimage docker-compose up -d gear docker-compose up --exit-code-from deploy deploy volumes: - name: 'ssh' path: /root/.ssh - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: - '-c' - | _imagetag=$$(echo gcr.io/${PROJECT_ID}/gear_$$_localrepo:$$_branch) echo "tag: $$_imagetag" docker commit buildimage_gear_1 $$_imagetag docker push $$_imagetag
AXLBIT Inc. • ⾃動テスト実⾏のためのベースイメージとして • 開発者にGCEのテンプレート共に渡す • 社内のデモ環境としてGKE上で起動 作ったイメージを何に使っているのか 13
AXLBIT Inc. • Cloudbuild.yamlをリポジトリの外に置きたい。 } Buildやテストのプロセス修正時に本筋の commit log が汚れる }
実⾏プロセスは極⼒別リポジトリのShellにおいて、都度pull • プルリクがあるときだけ実⾏したい } Envファイルにマージターゲットのブランチを記載しGithub API でプルリクの存在チェック。あるときだけ実⾏ ▪ -> いまは プルリク連携できるらしいと。。 • これまでの最⻑Buildは13時間、、 } かなり無駄遣いしている感 悩んだことと対応してきたこと 14