こんばんは、エンジニアの眠れない夜です。
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を作成します。この中に実行したいコードを書きます。
#!/usr/bin/env bash
supervisord -n
busybox crond -b -L /dev/stderr
今回の場合はこんな感じです。Cronを実行しながらsupervisordでPythonを常駐化させたいというのが私のニーズです。
作成したファイルをコピーして、実行権限を与えて、最後にCMDで/startup.shで起動します。
Dockerfileにはこのように書きます。
COPY startup.sh /startup.sh
RUN chmod 744 /startup.sh
CMD ["/startup.sh"]
あとはbuildしてrunしてみてください。これで/startup.shに書いた複数のコマンドが実行されているはずです。
Docker-Composeで起動時に複数行のコマンドを実行する方法も記事にしているのでぜひこちらもご覧ください。きっとこの先役に立つはずです!
コメントを残す