Dockerでビルド時にインタラクティブなコマンドを実行するためにしたこと

公開日:2019-05-23
最終更新:2019-05-23

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のビルド中に環境変数が認識されない

記事が少しでもいいなと思ったらクラップを送ってみよう!
1
+1
@showyleeの技術ブログ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする