GitHub Actionsとdocker-compose

GitHub Actionsではdockerhubのイメージを使ったワークフローが組めるが、docker-composeも使える。ローカル開発時はdocker-composeで制御することが多いので、そのまま活用できるのはシンプルで強力。

ワークフローの書き方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# This is a basic workflow to help you get started with Actions
name: docker-compose

# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the master branch
on:
push:
branches:
- master

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest

# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2

# Runs a single command using the runners shell
- name: compose-run
shell: bash
env:
ENVENV1: ${{ secrets.ENVENV1 }}
ENVENV2: ${{ secrets.ENVENV2 }}
run: |
docker-compose up -d
docker-compose exec -T app bash xxxxxxxx.sh

環境変数とシークレット

docker-composeのパラメーター定義

Dockerに渡すパラメーターは環境変数としてdocker-compose.ymlで次の定義をする。

1
2
3
4
environment:
PYTHONDONTWRITEBYTECODE: 1
ENVENV1: ${ENVENV1}
ENVENV2: ${ENVENV2}

ローカル開発中のパラメーター

docker-compose.ymlはGitリポジトリに含めるため、公開すべきでないパラメーターは.envファイルに記述する。
.envファイルは.gitignoreで管理対象外として定義しておく。

1
2
ENVENV1=xxxxxxxxxxxxxx
ENVENV2=yyyyyyyyyyyyyy

GitHub Actionsでのパラメーター

GitHub Actionsでは.envのかわりに、リポジトリの設定でSecretsを使用して定義する。
たとえばSecretsに定義したパラメーターをGitHub Actionsで参照するのは以下の定義になる。

1
2
3
env:
ENVENV1: ${{ secrets.ENVENV1 }}
ENVENV2: ${{ secrets.ENVENV2 }}

GitHub Secrets width=640

ワークフローでdocker-composeを使う

docker-composeの起動方法

そのままdocker-composeコマンドが使用できる。

docker-compose内で定義されたDBなどの依存するサービスはdocker-compose up -dで起動し、docker-compose exec -T app bash xxxxxx.shでメインのコードを実行する。

  • docker-compose up -dはサービスを起動して、コマンド自体は終了
  • docker-compose execでバックグラウンド起動したサービスにAttachし目的のコマンドを実行

the input device is not a TTY

docker-compose exec -T app bash xxxxxxxx.shの実行でエラーになった。

1
2
the input device is not a TTY
##[error]Process completed with exit code 1.

解決方法は2つある

  1. 環境変数COMPOSE_INTERACTIVE_NO_CLI=1を使用する
  2. docker-compose exec -Tで起動する