ベストプラクティスと例dockerfile

ベストプラクティスは、公式ドキュメントのアドレスに浮上しているDockerfile ライティングDockerfilesためのベストプラクティスあなたはイタリアの巨匠の前にベストプラクティス、やや関公を記述する場合。そこで、この記事では、公式文書の翻訳で、理解して、例を拡張し、補完します

コンテナは短命でなければなりません

Dockerfile開始をミラーリング構築した容器の簡単な(短命)とする必要があります。ショートあなたがすぐに始めることができることを意味して終了

使用して、ビルドファイルとは無関係の除外.dockerignore

.dockerignore文法と.gitignore一貫性のある構文。など、無関係排除するために、ビルドファイルやディレクトリにそれを使用しますnode_modules

多段階の建設

多段階の建設が効果的に、ビルドプロセスのアプリケーションは、多くの場合、次の必要な言語コンパイラのために、特に、ミラーの量を減らすことができます

  1. インストールのコンパイルツール
  2. サードパーティのライブラリの依存関係をインストールします。
  3. コンパイルビルドアプリケーション

最初の2つのステップは、多段階のビルドがこの問題を回避する使用して、冗長ボリュームのミラーリングがたくさんあります

この建物はあるGoの応用例

FROM golang:1.11-alpine AS build

# Install tools required for project
# Run `docker build --no-cache .` to update dependencies
RUN apk add --no-cache git
RUN go get github.com/golang/dep/cmd/dep

# List project dependencies with Gopkg.toml and Gopkg.lock
# These layers are only re-built when Gopkg files are updated
COPY Gopkg.lock Gopkg.toml /go/src/project/
WORKDIR /go/src/project/
# Install library dependencies
RUN dep ensure -vendor-only

# Copy the entire project and build it
# This layer is rebuilt when a file changes in the project directory
COPY . /go/src/project/
RUN go build -o /bin/project

# This results in a single layer image
FROM scratch
COPY --from=build /bin/project /bin/project
ENTRYPOINT ["/bin/project"]
CMD ["--help"]

これは、フロントエンド・アプリケーションを構成した例である、あなたはを参照することができ、効率的先端アプリケーションのドッキングウィンドウを展開する方法

FROM node:10-alpine as builder

ENV PROJECT_ENV production
ENV NODE_ENV production

# http-server 不变动也可以利用缓存
WORKDIR /code

ADD package.json /code
RUN npm install --production

ADD . /code
RUN npm run build

# 选择更小体积的基础镜像
FROM nginx:10-alpine
COPY --from=builder /code/public /usr/share/nginx/html

不要なインストールパッケージを避けます

小型化、減少したビルド時間。使用したフロントエンドアプリケーションnpm install --production装置は、唯一の生産パッケージに依存します。

コンテナで一つのことを行います

Webアプリケーションとして三つの部分、Webサービス、データベースとキャッシュが含まれています。コンテナ、便利なスケールの複数にそれらを切り離します。あなたは、ネットワークトラフィックに必要がある場合は、次のネットワークへとそれらをもたらすことができます。

私の個人的なサーバーのように、私が使用したtraefik負荷分散やサービスの発見を行うには、アプリケーションとデータベースがすべてあるtraefik_defaultネットワークの下で、詳細はを参照してくださいtraefikの使用ロードバランシングおよびサービス検出を行います

version: '3'

services:
  # 该镜像会暴露出自身的 `header` 信息
  whoami:
    image: containous/whoami
    restart: always
    labels:
      # 设置Host 为 whoami.docker.localhost 进行域名访问
      - "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"

# 使用已存在的 traefik 的 network
networks:
  default:
    external:
      name: traefik_default

ミラーリングは、層の数を減らします

  • のみRUNCOPYADD層の数を作成し、他の命令は、ボリュームのミラーリングを増加させないであろう
  • 可能な限り、多段階のビルドを使用します

インストールは、次の方法に依存します

RUN yum install -y node python go

依存間違った方法を取り付け、これはミラーの層数が増加します

RUN yum install -y node
RUN yum install -y python
RUN yum install -y go

複数行の順序パラメータ

そして、読みやすさの容易さは偶然ディスペンサーパッケージを繰り返します

RUN apt-get update && apt-get install -y \
  bzr \
  cvs \
  git \
  mercurial \
  subversion

建物のキャッシュをフルに活用

ミラーの建設中にdocker横断Dockerfile順次、ファイル内のすべての命令を。各命令のために、dockerそれ以外の場合は、新しいイメージを作成し、キャッシュに反映既存の再利用可能かどうかを検索します

我々は使用することができますdocker build --no-cacheスキップキャッシング

  • ADDそして、COPYファイルが計算されますchecksumキャッシュを使用するかどうかを決定するために変更されました
  • RUNコマンド文字列のキャッシュがヒットした場合と同じくらい、見るためにRUN apt-get -y update問題がある可能性があります

nodeアプリケーション、最初のコピーができpackage.json、インストールに依存すること、そしてその後、ディレクトリ全体を追加し、完全にキャッシュを利用するために行うことができます。

FROM node:10-alpine as builder

WORKDIR /code

ADD package.json /code
# 此步将可以充分利用 node_modules 的缓存
RUN npm install --production

ADD . /code

RUN npm run build 

おすすめ

転載: www.cnblogs.com/xianwang/p/12039922.html