Linuxの環境の仮想化カスタムJAVAドッカードッカー基準及び公開

最近では、古いMac Proのは、できるだけ早く交換することが、老婦人は、クラスタ環境を構築するためにドッカーを始めました。大規模データのクラスタ環境の開発、いくつかのオンラインリソース、わずか1環境があり、頭痛を見ている老婦人は、彼女は選択の余地がなかったが、構築します。私たちは、環境のために良い基盤を構築してみましょう。これは、Java、Scalaの、およびSSHD環境が含まれています。

準備

まず、自分のファイルディレクトリファイル内の老婦人があります:Dockerfileこれは、あなたがオンラインパッケージを準備することができ、加えて、私たちは私たちの環境のScalaとJavaのパッケージパッケージを準備する必要があり、独自に作成、妻はオフラインだけでなくオフラインで使用する必要があります。老婦人のカタログを参照してください
ドッカー塩基1
しなかったこと、これは老婦人のディレクトリです。当然のことながら、私はゼロから作成されてここにいます。したがって、この持っているDockerfileファイルを。

Dockerfile

このファイルには、老婦人は、この内部の一部ではまだ必要と述べました。

指定からベース画像

たとえばで多くの高品質の画像、私たちの倉庫でドッカーあり:nginxの、Redisの、モンゴ、mysqlの 、httpdの、PHP、Tomcatのとそうで、開発するいくつかの簡単ながありますが、ビルドは、のような言語のミラーリングアプリケーションのさまざまなを実行しますノード、OpenJDKの、パイソン、ルビー、 golang など。これであなたは最高の出会いが私たちの究極の目標は、基本イメージをカスタマイズすることであるとミラーを見つけることができます。
ここから再構築物の意味に既存のミラーに基づいて、を指します。
例えば、古い:FROM centos:centos7.7.1908老婦人のcentos7.7.1908から示すベース画像。

RUNラン

定義によるRUNは、実行を意味し、実行されます。:ここでは、例えば、私は、フォルダを作成したい、Linux上で実行された命令の実行の私たちのために行きますRUN mkdir -p /opt/module

COPYファイルをコピーします

フォーマット:

  • COPY [--chown=<user>:<group>] <ソースパス> ... <デスティネーションパス>
  • COPY [--chown=<user>:<group>] [ "<ソースパス1>"、... "<インストール先パス>"]

これは、任意の処理をせずに、コピーに加えて、純粋な複製です。

より高度なコピーファイルを追加

基本的には同じフォーマットとCOPYとADD命令の本質。しかし、いくつかの追加機能を備えたCOPYベース。

例えば:

  • パスはのURLのソースすることができ、これは非常に高速なハードウェアです。

  • ソースディレクトリが圧縮されたファイルであれば、それはターゲットディレクトリに自動的に解凍されます、これはより多くのNiubiです

ドッカー公式Dockerfileのベストプラクティスの文書化要件、可能な限りCOPYを使用して、それがクリアされているので、ファイルをコピーすることが、むしろADDは、その行動が必然的に非常に明確ではない、より複雑な機能が含まれているセマンティクスをコピーします。最も適した機会のADDは、自動的に解凍され、機会することが提案されています。

また、ADD命令キャッシュの無効化は、画像の建物につながる可能性がミラーリング建物は、遅くなるでしょう、ということに注意してください。

したがって、COPYおよびADD命令時に選択した、あなたは、すべてのファイルは、COPYコマンドを使用してコピーされ、この原則に従うだけで、自動的に解凍機会に必要なADDを使用することができます。
説明書を使用する場合は、さらに--chown =追加することができます ユーザーグループを変更し、ファイルを所属するオプション。

ADD --chown=55:mygroup files* /mydir/
ADD --chown=bin files* /mydir/
ADD --chown=1 files* /mydir/
ADD --chown=10:11 files* /mydir/

CMDコンテナの起動コマンド

RUN CMD形式と命令が似ていますが、また、2つの形式で:

  • シェル形式:CMD <コマンド>
  • EXEC形式:CMD [ "実行"、 "パラメータ1"、 "パラメータ2" ...]
  • パラメータリスト形式:CMD [ "パラメータ1"、 "パラメータ2"、...]。ENTRYPOINT命令を指定した後、特定のパラメータCMDを指定します。

かつて言ったときに、コンテナの導入前に、ドッカーは、コンテナはプロセスであり、仮想マシンではありません。それはプロセスであるので、あなたは、コンテナを起動したときに、そう、あなたはプログラムや実行中のパラメータを指定する必要があります。CMDコマンドは、デフォルトのコンテナメイン処理開始コマンドを指定するために使用されます。

我々ダイレクトドッキングウィンドウの実行-it Ubuntuは、その後のbashに直接行く場合は、たとえば、Ubuntuのは、CMDのデフォルトは/ binに/ bashのあるミラー、ミラーコマンドにデフォルト設定を置き換えるために、実行時に新しいコマンドを指定することができます。また、-it Ubuntuの猫の/ etc / OSリリースを実行して、このようなドッキングウィンドウなど、実行時に実行するために他のコマンドを指定することができます。これは、システムのバージョン情報の出力、デフォルトの/ binに/ bashコマンドに猫の/ etc / OS-releaseコマンドに置き換えられています。

命令フォーマットでは、一般的に二重引用符「の代わりに単一引用符を使用するので、必ず、EXECフォーマット、構文解析は、JSON配列として解析されるようなフォーマットを使用することをお勧めします。
フォアグラウンドでコンテナアプリケーションを言及する必要がありますCMDに言及します背景の問題の実装と実行が。これは混乱初心者がしばしば発生しています。

ドッキングウィンドウは、アプリケーションコンテナではなく、仮想マシンよりも、駅の前に実行する必要があり、仮想マシンではなく、バックグラウンドサービスを開始するにsystemdと同じように内部の物理マシン、コンテナ内のバックグラウンドサービスの概念はありません。

いくつかの初心者は、次のように書き込まれますCMD:

CMD service nginx start
そしてすぐに、コンテナのうち、実行後に発見されました。でも、彼らは単に実行できないことが判明した容器でsystemctlコマンドの結果を使用します。徹底的に、フォアグラウンド、概念の背景を理解していないコンテナを理解することは、まだ伝統的な仮想マシンの角度で、差コンテナおよび仮想マシンを言わなかったからです。

コンテナの場合は、ランチャーアプリケーション・プロセスがコンテナで、コンテナはマスター・プロセスに、メインプロセスが終了存在している、コンテナは無意味存在し、したがって出るだろう、それは他の補助プロセスを気にする必要があるものではありません。

使用するservice nginx startコマンドは、それがサービスの形でスタートnginxのデーモンの後に台湾に成り上がり期待されています。そして、私はCMDのサービスのように理解されるであろう開始nginxの言ったCMD [ "sh", "-c", "service nginx start"]ので、メインプロセスは、実際のshで、。サービスの終了startコマンドをnginxのときに、SHがオーバーになり、SHプロセスは、メインの出口として、あなたは自然にコンテナ出口を行います。

正しいアプローチは、直接nginxの実行可能ファイルを実行することであり、実行の形で前段階を必要とします。例えば:

CMD ["nginx", "-g", "daemon off;"]

ENTRYPOINTエントリポイント

エントリポイントフォーマットとRUNコマンドフォーマット、及びフォーマットのようなEXECシェル形式に分割されます。

ENTRYPOINT目的とCMDは、指定されたコンテナ内にあり、プログラムパラメータを開始します。ENTRYPOINTは、実行時に置き換えてもよいが、少し面倒CMD、パラメータ--entrypointドッキングウィンドウの実行で指定する必要がありますよりもします。

エントリーポイント、CMDは、それが変更された意味を指定すると、それはもはや直接操作コマンドではありませんが、エントリーポイントのパラメータとしてCMDコマンドの内容は、他の言葉にするとき、実際の実装では、となります。

<ENTRYPOINT> "<CMD>"

環境変数を設定しENV

2つの形式があります。

ENV
ENV = = ...

ARGビルドパラメータ

フォーマット:ARG <パラメータ名> [= <デフォルト>]

効果は同じビルド・パラメータであるとENVは、環境変数を設定しています。違いは、これらの環境変数が存在することは、将来のコンテナには実行されません、その、提供ARGビルド環境変数環境です。ドッキングウィンドウの歴史は、まだすべての値を見ることができるので、しかし、ARGパスワードなどの使用に関する情報を保持しません。

Dockerfile ARG命令パラメータ名が定義され、デフォルト値の定義されています。このデフォルト値はカバーされ--build-argに<パラメータ名> = <値>と注文ドッキングウィンドウビルドで構築することができます。

バージョン1.13、--build-引数でリクエストパラメータ名の前に、あまりにもあなたはARG Dockerfileで定義する必要がありますつまり、指定された--build-argのパラメータはDockerfileで使用する必要があり、使用。対応するパラメータが使用されていない場合は、終了建物をエラーになります。最初から1.13は、この厳しい制限が解除され、もはや出口に与えられていないが、警告メッセージが表示され、ビルドに継続されています。この時間は、同じビルドプロセスとCIシステム、ビルド異なるDockerfileの使用は、ビルドコマンドは、各Dockerfileの内容に基づいて修正されなければならない回避するために、より有用です。

VOLUME匿名定義されたボリューム

形式は次のとおりです。

  • VOLUME [ "<パス1>"、 "<パス2>" ...]
  • VOLUME <パス>

私たちは、コンテナは、ランタイム・コンテナ・ストレージ層はデータベースアプリケーションクラスの書き込みが動的なデータを保存する必要が発生しません、ファイルは、そのデータベースのボリューム(ボリューム)に格納する必要が維持されるべきで、前にも言っている、後の章では、我々はさらにロールドッカーをご紹介しますコンセプト。ユーザーがマウント指定されていない場合Dockerfileで、ボリュームをマウントしたディレクトリにファイルを保存するために、実行時の動的ユーザー忘れを防ぐために、我々は、実行時に、特定のディレクトリが匿名ボリュームとしてマウントあらかじめ指定することができ、また、アプリケーションは正常であることができます操作は、大量のデータコンテナの記憶層に書き込まれません。

VOLUME /データ

ここで/データディレクトリが自動的に実行匿名ボリュームにマウントされ、任意の情報/データは、このように記憶層のコンテナの自由な状態を確保する、記録層を格納するための容器に書き込まれません。もちろん、あなたが、これは、実行時の設定をマウント上書きすることができます。例えば:

docker run -d -v mydata:/data xxxx
このコマンドラインでは、この命名の使用は、ボリューム/データこの位置、代替構成匿名Dockerfileは、ボリュームを定義したマウントをマウントMYDATA。

声明ポートを公開

フォーマット<ポート1> [<ポート2> ...]を公開します。

サービスは、コンテナ港文を実行時提供することであるディレクティブを公開し、これはただの声明で、この文は、このサービスポートは、実行時に開きます使用することはありません。そのような声明書かDockerfileでは、ミラーは、構成マッピングを容易にするためのサービスをミラーリングこのポートの保護者の理解を助けるユーザーにある、2つの利点があり、他には、実行時にランダムなポートマッピングを使用することで、ある、ドッキングウィンドウの実行を-P、それは自動的にランダムにマッピングポートを公開します。

実行時に公開し、<ホストポートを> -p使用するには:<コンテナポート>を区別しました。-p、それは、他の言葉では、外の世界に対応した公共サービスへのアクセスのコンテナポートをホストポートとコンテナポートをマッピングしていますが、唯一のコンテナポートを使用する予定のものの単なる声明を公開し、ホストに自動的にポートではないマッピングを行います。

WORKDIRは作業ディレクトリを指定します

WORKDIR <作業ディレクトリのパス>をフォーマットします。

各レイヤーの現在のディレクトリが指定されたディレクトリに変更された後に使用WORKDIR命令は、ディレクトリが存在しない場合は、WORKDIRはディレクトリを作成するのに役立ちます、作業ディレクトリを指定する(または現在のディレクトリと呼ばれる)ことができます。

いくつかの一般的な間違いの初心者に言及する前に、書き込みにDockerfileシェルスクリプトに相当し、この間違った理解はまた、次のエラーにつながる可能性が発生します。

RUN cd /app

RUN echo "hello" > world.txt

このDockerfileビルドが実行をミラーリングする場合は、/app/world.txtファイルやその内容はハローではありません見つけることができませんでしょう。その理由は、シェルで、シンプルで、連続した2行は同じプロセスの実行環境は、前のコマンドがメモリ状態を変更するので、それが直接コマンドの後に影響します、であり、Dockerfileで、2行は根本的に異なるコマンド実行環境を実行します、2つの全く異なるコンテナです。これは、理解不足に起因する階層型ストレージDockerfileのビルドエラーの概念です。

RUNはそれぞれ、コンテナを起動するコマンドを実行して、ファイルストレージ層の変更を提出する前に言われています。第一層のRUN CD /アプリを実行すると変更の現在のプロセスの単なる作業ディレクトリで、それのメ​​モリの変化が、結果は任意のファイルの変更が発生することはありません。時間によって、第2層は、新しいコンテナの開始は、第一の層を持つコンテナがより完全問題で、自然遺産の層を構築するプロセスの前にメモリーを変更することはできませんしませんです。

あなたが作業ディレクトリの層の後に位置を変更する必要があるのであれば、あなたはWORKDIR命令を使用する必要があります。

USERは、現在のユーザーを指定します。

フォーマット:USER <ユーザー名> [:<ユーザーグループ>]

環境条件や衝撃層を変更した後、同様のUSERコマンドとWORKDIR、。WORKDIRはUSERのRUNは、状態変化層、CMDとENTRYPOINTな注文後に実行され、作業ディレクトリを変更することです。

WORKDIR、USERはちょうどあなたが指定したユーザーのみ、ユーザーが事前に確立されなければならないに切り替え手助けとして当然のことながら、そして、それ以外の場合は、切り替えることはできません。

RUN groupadd -r redis && useradd -r -g redis redis

USER redis`
RUN [ "redis-server" ]

面倒な設定を必要とし、このようなサービス・プロセスを実行するために、優れたユーザーを確立していることを期待としてのアイデンティティの変化は、suコマンドまたはsudoを使用しないことを根希望、などのスクリプトの実行中に、もし、およびTTYの不在で多くの場合、間違っている環境。推奨gosu。

# 建立 redis 用户,并使用 gosu 换另一个用户执行命令
RUN groupadd -r redis && useradd -r -g redis redis
# 下载 gosu
RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.7/gosu-amd64" \
    && chmod +x /usr/local/bin/gosu \
    && gosu nobody true
# 设置 CMD,并以另外的用户执行
CMD [ "exec", "gosu", "redis", "redis-server" ]

ヘルス・ヘルスチェック

フォーマット:

ヘルス[オプション] CMD <コマンド>:設定血管の健康コマンドを確認しない
ヘルス・NONEを:ベースイメージは、ヘルスチェック指示を持っている場合は、この行を使用するマスクすることができ、自分の健康チェック命令
ヘルス命令はドッカーは、コンテナ状態かどうかを判断すべきか指示することです通常、これはドッカー1.12が導入された新しいコマンドです。

ヘルス命令の非存在下で、ドッカーエンジンは、コンテナがコンテナメイン処理が終了する異常状態にあるか否かによって判断することができます。多くの場合、これは問題ではありませんが、プログラムがロックアップするか、無限ループ場合は、アプリケーション・プロセスは終了しませんが、コンテナがサービスを提供することができませんでした。以前1.12において、ドッカーは、容器の一部で、その結果、再スケジュールしないように、容器のこの状態を検出しないであろう、まだユーザーの要求を受け付けているサービスを提供することができなかったかもしれません。

コマンドラインは、実際の反応容器の実際の状態を比較するために、さらにメイン処理容器通常のサービス状態によって決定されるかどうか、および1.12ので、ドッカーは、ヘルス命令を単一のコマンドで指定された命令を提供しました。

連続して失敗の一定数が不健康になるだろうかどうかの確認は、成功したヘルス健康的な命令になった後の画像は、その開始の容器、開始の初期状態で、命令ヘルスに指定されている場合。

ヘルスは、以下のオプションをサポートしています。

  • --interval = <間隔>:二つのヘルスチェック間隔、デフォルトは30秒です。
  • --timeout = <期間>:ヘルス・チェック・コマンドよりこの時間よりも、このヘルスチェックが失敗と見なされた場合は、30秒のデフォルトのタイムアウトを実行します。
  • --retries = <番号>:連続して失敗の指定された数、状態が不健康なコンテナ、デフォルトの3回とみなされます。

そして、CMD、ENTRYPOINT同じことは、ヘルスチェックは、あなたがより多くの書いた場合、最後のものだけが動作しますが、一度だけ表示されます。

ヘルスにおける[オプション] CMD後続のコマンド、フォーマット及びシェル、およびEXECフォーマットに分割ENTRYPOINT同じフォーマット。失敗; 2:1;成功:0:コマンドの戻り値は、サブの健康チェックやないの成功を決定予約は、この値を使用しないでください。

私たちは、ミラーは、最も単純なWebサービスであるとし、我々はヘルスのDockerfileを書くことができるかを決定助けにカールを使用することができ、そのWebサービスが正常に動作しているかを決定するために健康検査を高めるために願っています:

FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=5s --timeout=3s \
  CMD curl -fs http://localhost/ || exit 1

ここでは、ヘルスチェックコマンドは失敗として3秒以上に反応しなかった場合、(そう、実際にする必要があり、比較的長い非常に短い間隔のテストのためにここで)5秒ごとに一度検査設定、および使用カール-fsます。http:// localhost /を||ヘルスチェックコマンドとして1番出口。

このイメージを構築するためにドッキングウィンドウのビルドを使用します。

docker build -t myweb:v1 .

まあ構築、我々は、コンテナを起動します。

docker run -d --name web -p 80:80 myweb:v1

ミラーを実行した後、あなたはドッキングウィンドウコンテナLS初期状態(:始まる健康)で見ることができます。

docker container ls

数秒待った後、再びコンテナLSドッキングウィンドウ、あなたは健康状態の変化(健康)指令上記の:(実装)が表示されます

ヘルスチェック連続して失敗を再試行の回数を超えた場合、ステータスは(不健康)に変更されます。

ヘルプトラブルシューティングするために、(stdoutとstderrを含む)ヘルスチェック出力コマンドが正常な状態で保存されます、あなたは、ドッキングウィンドウを使用することができます参照して点検します。

docker inspect --format '{{json .State.Health}}' web | python -m json.tool
{
    "FailingStreak": 0,
    "Log": [
        {
            "End": "2016-11-25T14:35:37.940957051Z",
            "ExitCode": 0,
            "Output": "<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\n    body {\n        width: 35em;\n        margin: 0 auto;\n        font-family: Tahoma, Verdana, Arial, sans-serif;\n    }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n",
            "Start": "2016-11-25T14:35:37.780192565Z"
        }
    ],
    "Status": "healthy"
}

ONBUILD他人のために目を覚まし

フォーマット:ONBUILD <その他の命令>。

ONBUILDが特殊コマンドであり、このような等RUN、COPY、等の他の命令、と続いて、カレントミラーを構成するとき、これらの命令が実行されません。場合にのみ、ベース画像として現在の画像が、ミラーが実行されるときに次のステージを構築します。

Dockerfile他の命令は、人々が彼らの準備をカスタマイズする助けにのみONBUILD、カスタマイズされたカレントミラーのために用意されています。

私たちが書かれたのNode.jsアプリケーションをミラーリングするとします。Node.jsのは、NPMのパッケージ管理を使用して行うことを私たちは皆知っているが、すべての依存関係は、コンフィギュレーション、スタートアップ情報はpackage.jsonファイルを配置します。プログラムコードを取得するには、あなたは彼らが必要なすべての依存関係を取得することができます前に、NPMインストールする必要があります。その後、NPM開始してアプリケーションを起動することができます。そのため、一般的にDockerfileを書き込みます:

FROM node:slim
RUN mkdir /app
WORKDIR /app
COPY ./package.json /app
RUN [ "npm", "install" ]
COPY . /app/
CMD [ "npm", "start" ]

良いイメージを構築するためのNode.jsプロジェクトのルートディレクトリにこのDockerfileした後、直接の容器の運転を開始するために使用することができます。私たちは第二のNode.jsプロジェクトを持っている場合でも、ほとんどすぎますか?まあ、それは、第2のプロジェクトにこのDockerfileをコピーします。3番目のプロジェクトは、それがある場合には、そう?そして、それをコピー?文書の複数のコピーは、より困難なバージョン管理は、のは、このようなシーンのメンテナンスの問題を見ていきましょう。

こうしたノックタイプミスや追加パッケージをインストールする必要があるとして、問題のDockerfile、その後、開発者の修正このDockerfile、ビルドが再びことを発見、開発プロセスの最初のNode.jsプロジェクト場合は、問題が解決されます。?最初のプロジェクトは問題ありませんが、2番目のプロジェクト、それ?当初もののDockerfileはコピーであり、最初のプロジェクトからペーストしますが、最初のプロジェクトは、彼らのDockerfile、Dockerfile目のプロジェクトは自動的に修復される一方を修復するわけではないので。

私たちは、その後、各項目の基本イメージにそれを使用して、基本イメージを行うことができますか?このような基本イメージの更新は、同期Dockerfile様々なプロジェクトの変更せずに、更新ベースイメージを継承した後に再構築しますか?さて、あなたは、私たちはこの結果を見てみましょうことができます。そして、上記はDockerfileになります:

FROM node:slim
RUN mkdir /app
WORKDIR /app
CMD [ "npm", "start" ]

ここでは、サブプロジェクトに入り、プロジェクトの実施に関連した命令を構築します。ベースイメージの名前は私のノードであると仮定すると、各プロジェクト内でのDockerfileは次のようになります。

FROM my-node
COPY ./package.json /app
RUN [ "npm", "install" ]
COPY . /app/

ベース画像が変化した後、様々なプロジェクトがミラーを再構築し、このDockerfileを使用している、あなたは更新され、ベースイメージを継承します。

だから、問題はそれを解決しましたか?いいえ。言うのは正確な、半分しか解決しました。そこにこのDockerfile場合はいくつかのものは、それを調整する必要がありますか?たとえば、あなたはどのように、いくつかのパラメータを追加する必要がありますインストールNPM?この行は、それが./package.json現在のプロジェクトを含むので、RUNベースイメージに入れることはできません、私たちは一つ一つにそれを修正する必要がありますか?したがって、この生産拠点の画像、オリジナルDockerfileの変化の問題を解決する唯一の最初の4つの命令、および変更は、3つの命令を扱うことができない完全に遅れています。

ONBUILDは、この問題を解決することができます。私たちはDockerfile ONBUILDベースイメージについての書き込みを再してみましょう:

FROM node:slim
RUN mkdir /app
WORKDIR /app
ONBUILD COPY ./package.json /app
ONBUILD RUN [ "npm", "install" ]
ONBUILD COPY . /app/
CMD [ "npm", "start" ]

基本イメージを構築するとき、我々は元Dockerfileに行くこの時間が、今回のプロジェクトに関連する命令プラスONBUILDは、そう、3行は実行されません。その後Dockerfile各プロジェクトは、単純に次のようになります。

FROM my-node

はい、これだけの行。各プロジェクトのディレクトリは、この1行Dockerfileはミラー、これらの3つのラインの基礎の前にミラーを構築使用する場合ONBUILD生成し、現在のプロジェクトの成功は鏡の中にコードをコピーして、開始、およびNPMの実装は、このプロジェクトのためにインストールされますアプリケーションイメージ。

環境のために私たちの基盤の構築を開始

# 指定基镜像 centos
FROM centos:centos7.7.1908

MAINTAINER      Fisher "[email protected]"
# 先执行更新

# 复制jdk到指定目录
RUN /bin/mkdir -p  /opt/software
RUN /bin/mkdir -p /opt/module
ADD jdk-8u201-linux-x64.tar.gz /opt/module

# 配置jdk环境
ENV JAVA_HOME /opt/module/jdk1.8.0_201
ENV PATH $PATH:$JAVA_HOME/bin

# 检测java版本,确认是否安装成功
RUN java -version

ADD scala-2.11.11.tgz /opt/module

# 配置SCALA 环境
ENV SCALA_HOME /opt/module/scala-2.11.11
ENV PATH $PATH:$SCALA_HOME/bin

RUN yum -y install openssh-clients
RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && \
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

CMD [ "sh", "-c", "systemctl start ssh;bash"]

実行後、我々はこれを見ることができます:
ドッカーベース-2
我々はそれが私たちのビルドの成功を意味し、正常を構築ご覧ください。今、私たちは見て行くことができます:
ドッカーベース-3

彼はドッカーハブにプッシュし始めました

ここでは、最初に少し何かを準備する必要があります:

  • DockerHubアカウントのパスワード

私たちは、そのここで、ノートを押し上げます。

  • 当社の倉庫や地元のミラーリングが一貫リポジトリなければなりません。

ドッカーベース-4

プッシュスタート

docker push sun1534/docker-base:7.8.11

ドッキングウィンドウベース-5

それでは、上記の私たちのDockerHubを見てみましょう:

ドッカーベース-6

おすすめ

転載: www.cnblogs.com/sun-iot/p/12144886.html