ベストプラクティスは、公式ドキュメントのアドレスに浮上しているDockerfile ライティングDockerfilesためのベストプラクティス。あなたはイタリアの巨匠の前にベストプラクティス、やや関公を記述する場合。そこで、この記事では、公式文書の翻訳で、理解して、例を拡張し、補完します
コンテナは短命でなければなりません
Dockerfile
開始をミラーリング構築した容器の簡単な(短命)とする必要があります。ショートあなたがすぐに始めることができることを意味して終了
使用して、ビルドファイルとは無関係の除外.dockerignore
.dockerignore
文法と.gitignore
一貫性のある構文。など、無関係排除するために、ビルドファイルやディレクトリにそれを使用しますnode_modules
多段階の建設
多段階の建設が効果的に、ビルドプロセスのアプリケーションは、多くの場合、次の必要な言語コンパイラのために、特に、ミラーの量を減らすことができます
- インストールのコンパイルツール
- サードパーティのライブラリの依存関係をインストールします。
- コンパイルビルドアプリケーション
最初の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
ミラーリングは、層の数を減らします
- のみ
RUN
、COPY
、ADD
層の数を作成し、他の命令は、ボリュームのミラーリングを増加させないであろう - 可能な限り、多段階のビルドを使用します
インストールは、次の方法に依存します
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