Dockerfile の下からビルドされた Docker イメージからコンテナを起動できません。Filebeat または Fluentd エージェントを起動するために CMD を追加すると失敗します。
Dockerファイル
#################################################
FROM node:12
#install pm2
RUN npm install pm2 -g
RUN apt update
#create dir and copy the code
RUN mkdir -p /home/devops/comera_registration_service/
WORKDIR /home/devops/comera_registration_service/
COPY . .
#fluentd install
COPY fl.sh .
RUN sh fl.sh
#install depend
RUN npm install
#start the app
CMD [ "pm2-runtime", "ecosystem.config.js" ]
CMD ["/etc/init.d/td-agent", "start" ]
#opening port
EXPOSE 3010
答え1
このnode:12
画像にはエントリポイントスクリプトが指定されるとENTRYPOINT
、Dockerは の値をCMD
次のように使用します。このエントリポイントコマンドのパラメータ。
親イメージのエントリポイントは、Dockerfile に次のコードを追加することで無効にできます。
ENTRYPOINT []
ちなみに、CMD
Dockerfile で複数の命令が指定されている場合、結果のイメージには最後の命令のみが設定されます。
上記の Dockerfile と親エントリポイントを削除すると、/etc/init.d/td-agent
コンテナの PID は 1 になります。これは init スクリプトなので、デーモンの起動が完了すると終了します。PID 1 がなくなると、コンテナは終了します。
コンテナ内で複数のプログラムを実行するには、ラッパースクリプトまたはプロセスマネージャが必要ですただし、これは一般的には推奨されません。たとえば、Kubernetes ではサイドカー コンテナ パターンが推奨されます。