この質問が出された 2014 年以降、多くの状況が発生し、多くのことが変化しました。今日、このトピックを再度検討し、最新の変更を反映するためにこの質問を 12 回目に編集しています。質問は長いように見えるかもしれませんが、時系列とは逆の順序で並べられているため、最新の変更は上部にあり、いつでも自由に読むのをやめることができます。
私が解決したかった問題は、ビルド中に Dockerfile でホスト ボリュームを Docker コンテナーにマウントする方法、つまり、docker run -v /export:/export
ビルド中にその機能を備える方法でしたdocker build
。
apt-get install
私にとって、その理由の 1 つは、Docker で何かを構築するときに、それらの ( ) キャッシュを単一の Docker にロックするのではなく、共有/再利用したいからです。
これが私がこの質問をした主な理由です。そして、私が現在直面しているもう 1 つの理由は、ホストから巨大なプライベート リポジトリを利用しようとしていることです。これは、git clone
プライベート SSH キーを使用して Docker 内のプライベート リポジトリから実行する必要がありますが、その方法がわからず、まだ調べていません。
最新のアップデート:
@BMitch の回答の Buildkit
この
RUN --mount
構文を使用すると、ビルド コンテキストから読み取り専用ディレクトリをバインド マウントすることもできます...
18.09 以降であれば、docker に組み込まれています (サードパーティのツールだと思っていました)。私のは 20.10.7 です --https://docs.docker.com/develop/develop-images/build_enhancements/
BuildKitビルドを有効にするには
docker を新規インストールした場合の最も簡単な方法は、docker build コマンドを呼び出すときに DOCKER_BUILDKIT=1 環境変数を設定することです。次に例を示します。
$ DOCKER_BUILDKIT=1 docker build .
それ以外の場合は、次のものを取得します:
the --mount option requires BuildKit. Refer to https://docs.docker.com/go/buildkit/ to learn how to build images with BuildKit enabled
したがって、これは上で説明した 2 番目のユースケースに最適なソリューションになります。
2019 年 5 月 7 日現在の更新:
docker v18.09 より前では、正解は次のようになります:
ビルド中にボリュームをマウントする方法はありますが、Dockerfiles は使用されません。
しかし、それは不十分な表現、構成、裏付けの回答でした。Docker を再インストールしていたときに、偶然次の記事を見つけました。
apt-cacher-ng サービスを Docker 化する
apt-cacher は、docker エンジンで実行できます。
これが、この/私の質問に対する docker の解決策です。直接的ではありませんが、間接的です。これは、docker が提案するオーソドックスな方法です。そして、私がここで尋ねようとしていた方法よりも優れていることは認めます。
もう 1 つの方法は、新しく受け入れられた回答(例: v18.09 の Buildkit) です。
あなたに合ったものを選んでください。
以前、 Docker 以外の Rocker という解決策がありましたが、Rocker は廃止されたため、回答を再び「不可能」に戻します。
古い更新:答えは「不可能」です。この問題は広範囲に議論されているので、私は答えとして受け入れることができます。参考: https://github.com/docker/docker/issues/3156移植性が docker 開発者にとって最も重要な問題であることは理解できますが、docker ユーザーとして、この機能が欠けていることには非常に失望していると言わざるを得ません。前述の議論からの引用で私の議論を締めくくりたいと思います。「Gentoo をベース イメージとして使用したいのですが、イメージがビルドされたら、1 GB を超える Portage ツリー データがどのレイヤーにも含まれることは絶対に望んでいません。インストール中にイメージに巨大な Portage ツリーが表示されなければ、いくつかの優れたコンパクトなコンテナーを使用できるはずです。」はい、必要なものをダウンロードするために wget または curl を使用できますが、移植性を考慮するだけで、Gentoo ベース イメージをビルドするたびに 1 GB を超える Portage ツリーをダウンロードしなければならないという事実は、効率的でもユーザー フレンドリーでもありません。さらに、パッケージ リポジトリは常に /usr/portage の下にあるため、Gentoo では常に移植可能です。繰り返しになりますが、私はその決定を尊重しますが、その間、私の失望も表明させてください。ありがとう。
元の質問の詳細:
から
ボリューム経由でディレクトリを共有する
ボリュームの扱い
データ ボリューム機能は「Docker Remote API のバージョン 1 以降で利用可能」であると書かれています。私の Docker はバージョン 1.2.0 ですが、上記の記事に示されている例は機能していないことがわかりました。
# BUILD-USING: docker build -t data .
# RUN-USING: docker run -name DATA data
FROM busybox
VOLUME ["/var/volume1", "/var/volume2"]
CMD ["/usr/bin/true"]
VOLUME コマンドを使用して、ホストにマウントされたボリュームを Docker コンテナにマウントする Dockerfile の適切な方法は何ですか?
$ apt-cache policy lxc-docker
lxc-docker:
Installed: 1.2.0
Candidate: 1.2.0
Version table:
*** 1.2.0 0
500 https://get.docker.io/ubuntu/ docker/main amd64 Packages
100 /var/lib/dpkg/status
$ cat Dockerfile
FROM debian:sid
VOLUME ["/export"]
RUN ls -l /export
CMD ls -l /export
$ docker build -t data .
Sending build context to Docker daemon 2.56 kB
Sending build context to Docker daemon
Step 0 : FROM debian:sid
---> 77e97a48ce6a
Step 1 : VOLUME ["/export"]
---> Using cache
---> 59b69b65a074
Step 2 : RUN ls -l /export
---> Running in df43c78d74be
total 0
---> 9d29a6eb263f
Removing intermediate container df43c78d74be
Step 3 : CMD ls -l /export
---> Running in 8e4916d3e390
---> d6e7e1c52551
Removing intermediate container 8e4916d3e390
Successfully built d6e7e1c52551
$ docker run data
total 0
$ ls -l /export | wc
20 162 1131
$ docker -v
Docker version 1.2.0, build fa7b24f
ベストアンサー1
VOLUME
命令を使用して、dockerにマウントするものを指示することはできません。そうすると、移植性が著しく損なわれます。この命令は、それらのディレクトリ内のコンテンツはイメージには含まれず、コマンドライン パラメータを使用して他のコンテナからアクセスできることを docker に指示します。ホストからディレクトリにアクセスするには、--volumes-from
を使用してコンテナを実行する必要があります。-v /path/on/host:/path/in/container
ビルド中にホスト ボリュームをマウントすることはできません。特権ビルドはなく、ホストをマウントすると移植性も著しく低下します。ビルドに必要なものをすべてダウンロードして配置するには、wget または curl を使用することをお勧めします。