web-dev-qa-db-ja.com

ローカルパッケージをDockerイメージにインストールする最良の方法

私が書いたpythonパッケージがあり、それを複数のDockerビルド内で使用したいと思っています。

ただし、Dockerfileフォルダーの外にあるローカルパッケージをインストールすることはできません。そして、パッケージを複数のプロジェクトにコピーしたくありません。

では、どのようにしてアーキテクチャを維持するのですか [〜#〜] dry [〜#〜]

8
Roman

十分に文書化された簡単な方法でこれを回避できる以外は、人々があなたに反対票を投じた理由はわかりません。

Dockerイメージは階層化されており、すべての画像に不可欠なすべてのパッケージを独自に作成した1つの新しいDockerイメージにビルドし、そこから拡張できます。

たとえば、dockerファイルを書き込むと、最初の行は次のようになります。

FROM someothercontainer

あなたができることはそれからあなたが書くすべての将来のコンテナであなたの "FROM"で使用するために新しいイメージを作成することです、これはそれが組み込まれています。簡単な例は次のようなコンテナを作成することです

FROM ubuntu
apt-get install python

次に、このイメージをmy-image-with-python-installedまたは機能するものとしてビルドします。

次に、独自のコンテナごとに独自のものをインストールする後のコンテナで、Dockerfileを次のように記述します。

FROM my-image-with-python-installed
ADD my-local-package
...

Dockerのページのドキュメントは、できる限り最小のベースイメージを構築することを望んでいるため、少し低レベルですが、ここで見つけることができます。 https://docs.docker.com/develop/develop-images/ baseimages /

FROMコマンドのドキュメントはここにあります https://docs.docker.com/engine/reference/builder/#from 最初にベースイメージをビルドする必要がありますが、ロードがありますそれを行う方法についての記事があります。

編集:

特にコンテンツが変更されない場合は、ベースイメージをリポジトリに保存するのが一般的です。このようにすると、さまざまなビルドマシンからアクセスでき、小さなローカルリポジトリのセットアップが非常に簡単で、頻繁に再ビルドする必要がありません。多くのアーティファクト管理ツールにもこの機能が組み込まれています。ただし、オンザフライでイメージをビルドしているが、それらすべてに共通のベースがある場合は、それをリポジトリに格納する必要はありません。まずベースイメージをビルドし、次に他のすべてのビルドマシンのローカルとしてビルドします。そのマシンで構築されたイメージはそれにアクセスできるようになります。

6
Mitch Kent

Dockerfileのニースパターンは次のようなものです。

FROM ubuntu:18.04

RUN apt-get update && apt-get install -y python3 python3-pip

COPY requirements.txt /tmp/base_requirements.txt
RUN python3 -m pip install -r /tmp/base_requirements.txt

COPY my_package_name/ /usr/lib/python3.6/my_package_name/

このようにして、パッケージはパスでアクセスでき、インポートできます。

0
Roman