Dockerでビルドする時にインタラクティブなコマンドを実行したい
- ビルドを対話可能に行うDocker Composeの機能は無いみたい
- Linuxのexpectコマンドで自動入力させる方針で
- ビルド時にSSHしてExitするだけの処理を例にしていますが、実際のファイルを適当に書き換えただけなので動作は保証しません。
expectスクリプトを作る
#!/bin/expect
set IP [lindex $argv 0]
set PASS [lindex $argv 1]
set timeout 5
spawn env LANG=C ssh ${IP}
expect {
-re "(yes/no)?" {
send "yes\n"
exp_continue
}
"password:" {
send "${PASS}\n
exp_continue
}
"\\\$" {
send "exit\n"
}
}
"\\\$" {
exit 0
}
Dockerの基盤イメージをalpineとする場合、expectのパスは/bin/expect
。
また、接続先IPアドレスとパスワードは引数で受け取る形にしてます。
Dockerfile
FROM node:10.11.0-alpine
ARG IP
ARG PASS
COPY sample.exp .
RUN set -x && \
apk add --no-cache --virtual .tmp_app expect && \
expect sample.exp ${IP} ${PASS} && \
apk del .tmp_app
以下略
接続先IPアドレスとパスワードはARGでdocker-compose.ymlから受けます。
また、expectスクリプトはexpect実行前にホストからCOPYで取得しておきます。
expectコマンドはイメージに含む必要がないので、ssh実行後削除してます。
docker-compose.yml
version: '3'
services:
sample:
build:
context: .
args:
- IP=${IP}
- PASS=${PASS}
以下略
argsでDockerfileに渡す変数を指定しています。
.env
実際の接続先IPアドレスとパスワードは.envに記載します。
IP=***.***.*.***
PASS=***************
まとめ
あとは.gitignore
に.envを追加してリモートに環境情報が流れないようにするとかして終わり。
expectのエスケープ処理や期待される応答がわからずに試行錯誤した。
参考
Linuxの対話がめんどくさい?そんな時こそ自動化だ!-expect編-
コマンドでの環境変数の受け渡し
docker-composeのビルド中に環境変数が認識されない
技術ブログをはじめよう
Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
.qrunch.io
メールアドレスで登録する
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく
0件のコメント