9

私は Docker を初めて使用し、単純な Dockerfile を使用してイメージを構築しようとしています。

FROM jenkins
USER root
RUN mkdir -pv /home/a/b
RUN touch /home/a/b/test.txt
RUN mkdir -pv /var/jenkins_home/a/b
RUN touch /var/jenkins_home/a/b/test.txt
USER jenkins

ビルドすると、次の出力で失敗します。

Step 0 : FROM jenkins
Step 1 : USER root
Step 2 : RUN mkdir -pv /home/a/b
  mkdir: created directory '/home/a'
  mkdir: created directory '/home/a/b'
Step 3 : RUN touch /home/a/b/test.txt
Step 4 : RUN mkdir -pv /var/jenkins_home/a/b
  mkdir: created directory '/var/jenkins_home/a'
  mkdir: created directory '/var/jenkins_home/a/b'
Step 5 : RUN touch /var/jenkins_home/a/b/test.txt
  touch: cannot touch '/var/jenkins_home/a/b/test.txt': No such file or directory

ここで何が欠けているのか、誰か教えてもらえますか? 最初の mkdir と touch の組み合わせが機能するのに、2 番目の組み合わせが機能しないのはなぜですか?

4

2 に答える 2

7

https://registry.hub.docker.com/u/library/jenkins/を見ると、 /var/jenkins_home がボリュームのようです。おそらく次のようなボリュームマッピングを使用して、コンテナの実行中にのみファイルを作成できます

docker run ... -v /your/jenkins/home:/var/jenkins_home ...

docker ビルド プロセスは、共有ボリュームについて何も知りません。

于 2014-12-14T14:17:34.700 に答える
6

これは現在docker/docker/issues/3639で調査されており、このコメントにまとめられています。

さて、私はほとんど調査を行いませんでしたが、ボリュームは Dockerfile 命令間で変更できないようです。
テスト用にさらに小さい Dockerfile を次に示します。

FROM busybox

RUN mkdir /tmp/volume
RUN echo "hello" > /tmp/volume/hello
VOLUME ["/tmp/volume/"]
RUN [[ -f /tmp/volume/hello ]]
RUN rm /tmp/volume/hello
RUN [[ ! -e /tmp/volume/hello ]]

各命令で、新しいボリュームを作成し、元のボリュームからコンテンツをコピーします

2019年4月更新

使用DOCKER_BUILDKIT=1
新しいビルダーはこの動作を示しません。

からの例dominikzalewski:

https://user-images.githubusercontent.com/13519572/55938628-13b60580-5c3c-11e9-8096-9ab860198920.png

これは、私が使用している非常に単純な Dockerfile です。

FROM wordpress:latest
ARG UPLOAD_DIR=/var/www/html/wp-content/uploads

RUN mkdir -p $UPLOAD_DIR
RUN ls -lhd $UPLOAD_DIR

参照。Docker のビルド機能強化

18.09 リリースの Docker Build の機能強化では、ビルド アーキテクチャの大幅なオーバーホールが導入されています。
BuildKit を統合することで、ユーザーはパフォーマンス、ストレージ管理、機能、およびセキュリティが向上するはずです。

  • Buildkit で作成された Docker イメージは、レガシー ビルドで作成された Docker イメージと同様に、Docker Hub および DTR にプッシュできます。
  • レガシー ビルドで機能する Dockerfile 形式は、Buildkit ビルドでも機能します。
  • 新しい--secretコマンド ライン オプションにより、ユーザーは、指定された Dockerfile を使用して新しいイメージを構築するための秘密情報を渡すことができます
于 2015-07-13T13:35:04.367 に答える