Dockerファイルにおける RUN・CMD・ENTRYPOINT の使い分け
DockerファイルでのRUN・CMD・ENTRYPINTは似たような命令です。ですが、これらを使い分けることができると(セキュリティ的にも)大変便利です。
対象
- Dockerの概要が分かっている人
- Linuxにおけるシェルの概要が分かっている人
RUN
- Dockerイメージを作成するときに実行されるコマンド
- 1つのDokerfileに複数記載が可能
ENTRYPOINT
- シェルを介さずにコマンドを実行する
- 1つのDokerfileに1つしか記載できない
CMD
- コマンドを実行する
- 1つのDokerfileに1つしか記載できない
ENTRYPOINT + CMD
- Dockerイメージpushを上手に使うことで、ENTRYPOINTのみのDockerイメージとCMDのみの実行コンテナとに分けることができる
- 実行コンテナ作成の際に、ENTRYPOINTのみのDockerイメージをpullする
- ENTRYPOINTのみのDockerイメージで指定したコマンドが実行コンテナで実行される
- 作成されたコンテナの用途を限定できる ― pullされるDockerイメージ側で指定したコマンドしか実行できないため
pullされるDockerイメージ
-
ENTRYPOINT
でコマンドを指定する
実行コンテナ
-
CMD
をENTRYPOINT
で指定したコマンドの補完となるよう指定する
例
下記のdockerfileを基にしたDockerイメージをDockerHubに上げます。
FROM alpine:latest
EXPOSE 80
RUN apk add --no-cache net-tools
RUN apk add --no-cache nmap-nping
ENTRYPOINT ["nping", "-c", "3", "--tcp", "-p", "80"]
ここでは{DockerID}/ping:latest
として上げています。DockerHubに上げる手順は以前の記事を参照してください。
実際に動かすコンテナのdocerfileは以下になります。
FROM {DockerID}/ping:latest
CMD ["www.google.co.jp"]
コンテナを構築し、実行します。
docker image build -t sample/ping:latest .
docker container run -p 80:80 --name ping sample/ping:latest
コンテナ実行結果:
まとめ
Dockerfileの命令は深く踏み込むと少々複雑です。効果的に使い分けてください。
参考
Author And Source
この問題について(Dockerファイルにおける RUN・CMD・ENTRYPOINT の使い分け), 我々は、より多くの情報をここで見つけました https://qiita.com/y_k_individual/items/4de7d0508edeeca8c637著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .