Dockerで複数CMDを実行する方法

Docker複数CSM実行

こんばんは、エンジニアの眠れない夜です。

Dockerで複数CMDを利用したい人のための簡単な解決方法です。

CMDとRUNの違い

まずは簡単にCMDとRUNの違いを説明します。

RUNはイメージを作成する前に実行されるものなのです。一方、CMDはイメージ作成後に実行されます。

なので、常駐化させたいプログラムを起動するコマンドをRUNで記述しても動いてくれません!( ̄◇ ̄;)

必ずCMDに書いてくださいね。

そして、CMDにはもう一つルールがあります。

CMDは最後の1行だけが実行される

CMDは複数行記述しても最後の1行しか実行されません…

[code]CMD [“supervisord”, “-n”,] CMD [“busybox” , “crond”, “-b”, “-L”, “/dev/stderr”][/code]

複数実行したいコマンドがあっても最後の1行しか実行されずにそれ以外の行は無視されてしまうということです。

そんなこと言われても複数行実行したいことがあるじゃないの!!と思う方もきっと多いはずです。

安心してください。ちゃんと実行できます。

DockerでCMDを複数実行する方法

前置きが長くなりましたがここからが本題です。

CDMを複数行実行するためにはシェルスクリプトを用意して、シェルスクリプトの中に実行したい複数のコマンドを書きます。シェルをCDMで実行すれば晴れて、複数コマンドをDocker内で実行できるというわけです。

DockerでCMDを複数実行する方法(設置編)

Dockerのホームディレクトリにstartup.shを作成します。この中に実行したいコードを書きます。

startup.sh

#!/usr/bin/env bash
supervisord -n
busybox crond -b -L /dev/stderr

今回の場合はこんな感じです。Cronを実行しながらsupervisordでPythonを常駐化させたいというのが私のニーズです。

作成したファイルをコピーして、実行権限を与えて、最後にCMDで/startup.shで起動します。

Dockerfileにはこのように書きます。

Dockerfile

COPY startup.sh /startup.sh
RUN chmod 744 /startup.sh
CMD ["/startup.sh"]

あとはbuildしてrunしてみてください。これで/startup.shに書いた複数のコマンドが実行されているはずです。

 

Docker-Composeで起動時に複数行のコマンドを実行する方法も記事にしているのでぜひこちらもご覧ください。きっとこの先役に立つはずです!

[DockerCompose]Commandを複数行実行する方法

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.