4

Docker のビルドに約 15 ~ 20 分かかる Python アプリケーションがあります。これが私のDockerfileが多かれ少なかれどのように見えるかです

FROM ubuntu:18.04
...
COPY . /usr/local/app
RUN pip install -r /usr/local/app/requirements.txt
...
CMD ...

今、skaffold を使用すると、コードの変更によって再構築がトリガーされ、既にインストールされているかどうかに関係なく、すべての要件が再インストールされます (COPY ステップから、他のすべてが再構築されます)。iDocker-compose では、この問題はボリュームを使用して解決されます。kubernetes では、ボリュームを次のように使用する場合:

apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- image: test:test
name: test-container
volumeMounts:
- mountPath: /usr/local/venv # this is the directory of the 
# virtualenv of python
    name: test-volume
volumes:
- name: test-volume
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4

この余分な要件のビルドは、skaffold で解決されますか?

4

3 に答える 3

1

@Matt の回答は優れたベスト プラクティス (+1)skaffoldです。それ自体では、ビルドのたびに要件を再インストールする必要がある、基礎となるレイヤー キャッシュの無効化の問題を解決できません。

パフォーマンスを向上させるために、ポッドにマウントされたすべてのpythonパッケージをキャッシュできます。次に例を示します。volume

apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- image: test:test
  name: test-container
volumeMounts:
- mountPath: /usr/local/venv
    name: test-volume
- mountPath: /root/.cache/pip
    name: pip-cache
volumes:
- name: test-volume
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4
- name: pip-cache
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4

そうすれば、ビルド キャッシュが無効になり、再インストールするrequirements.txt必要がある場合に、キャッシュからフェッチすることで時間を節約できます。

を使用してビルドしている場合は、kanikoを使用してベース イメージを永続ディスクにキャッシュすることもできます。kaniko-warmer次に例を示します。

...
volumeMounts:
...
- mountPath: /cache
    name: kaniko-warmer
volumes:
...
- name: kaniko-warmer
  awsElasticBlockStore:
    volumeID: <volume-id>
    fsType: ext4

kaniko-warmerポッド内での実行: docker run --rm -it -v /cache:/cache --entrypoint /kaniko/warmer gcr.io/kaniko-project/warmer --cache-dir=/cache --image=python:3.7-slim --image=nginx:1.17.3. 次のskaffold.yamlようになります。

apiVersion: skaffold/v1beta13
kind: Config
build:
  artifacts:
  - image: test:test
    kaniko:
      buildContext:
        localDir: {}
      cache:
        hostPath: /cache
  cluster:
    namespace: jx
    dockerConfig:
      secretName: jenkins-docker-cfg
  tagPolicy:
    envTemplate:
      template: '{{.DOCKER_REGISTRY}}/{{.IMAGE_NAME}}'
deploy:
  kubectl: {}
于 2019-08-29T20:07:03.897 に答える