web-dev-qa-db-ja.com

docker-compose、コンテナの起動後にスクリプトを実行しますか?

私はdocker-composeを介してRancherを介してサービスを提供しています。私が直面している問題は、コンテナが展開された後にパスワードを設定する必要があるということです。

ランチャーシークレットの動作方法は、シークレットを設定すると、ランチャーがコンテナにボリュームをマウントし、シークレットを含むファイルを作成することです。スクリプトを実行してそのシークレットを取得し、それを設定ファイルのパスワードとして設定できることを望んでいました。

秘密をgitに入れたくないので、Dockerfileを介してその秘密を取得する方法があるとは思わないので、docker-composeを使用してそれを行うことを検討しています。

これが可能かどうかは誰にもわかりますか?

17
Blooze

秘Theは、元のコマンドを呼び出す前に必要な初期化アクションを実行するために、composeコマンドを上書きすることです。

  1. パスワードの設定、内部構成ファイルの変更など、必要な初期化作業を実行するスクリプトを画像に追加します。それをinit.shと呼びましょう。画像に追加します。

Dockerfile:

FROM: sourceimage:tag
COPY init.sh /usr/local/bin/
  1. これで、Docker作成ファイルで、コンテナのメインアクションを実行する前にそのinitスクリプトを呼び出すだけです。

docker-compose.yml:

services:
  myservice:
    image: something:tag
    ...
    command: /usr/local/bin/init.sh && exec the_original_command_goes_here

メインコマンドを呼び出す前にexecを使用することが重要です。これにより、コマンドが最初のプロセス(PID1)としてインストールされ、stopやkillなどのシグナルを受信できるようになります。

10
Bernard

docker-composeは、既存の実行中のコンテナを変更する方法ではなく、コンテナを起動する方法を指定します。

Rancher documentation には、秘密のデフォルトの使用法として、docker-compose.ymlのsecrets配列の名前で秘密を参照できることが記載されています。

ターゲットファイル名は、シークレットの名前と同じ名前になります。
デフォルトでは、ターゲットファイル名はユーザーIDおよびグループID 0、ファイルモード0444として作成されます。
シークレットパーツでexternalをtrueに設定すると、シークレットが既に作成されていることを確認できます。

基本的なdocker-compose.ymlの例:

version: '2'
services:
  web:
    image: sdelements/lets-chat
    stdin_open: true
    secrets:
    - name-of-secret
    labels:
      io.rancher.container.pull_image: always
secrets:
  name-of-secret:
    external: true

実行中の1つのdocker-composeコンテナを更新する方法 」に示すように、コンテナの更新には「ビルド、キル、およびアップ」シーケンスが含まれます。

docker-compose up -d --no-deps --build <service_name>
1
VonC