2016-10-17 11 views
0

ドッカーファイルをmkdirにしたい.ssh/
しかし、そうではありません。Dockerfileのmkdir .sshフォルダはありませんか?

FROM jenkinsci/jnlp-slave 

MAINTAINER Johnny5 isAlive <[email protected]> 

USER root 

RUN rm /bin/sh && ln -s /bin/bash /bin/sh 

RUN apt-get update 
RUN apt-get install unzip git curl vim -y 

USER jenkins 

RUN mkdir -p /home/jenkins/.ssh && touch /home/jenkins/.ssh/aFile 

...建物... 見えますか?

Step 12 : RUN mkdir -p /home/jenkins/.ssh && touch /home/jenkins/.ssh/aFile 
---> Running in ca19a679580d 
---> 5980df7db482 
Removing intermediate container ca19a679580d 
Successfully built 5980df7db482 

実行と内部aFileの位置、周りの.ssh /フォルダを見てすることはありません...

$ docker run -it -u 0 --entrypoint /bin/bash 5980df7db482 
[email protected]:~# pwd 
/home/jenkins 
[email protected]:~# ls -al 
total 24 
drwxr-xr-x 3 jenkins jenkins 4096 Oct 17 23:17 . 
drwxr-xr-x 4 root root 4096 Sep 14 08:50 .. 
-rw-r--r-- 1 jenkins jenkins 220 Nov 12 2014 .bash_logout 
-rw-r--r-- 1 jenkins jenkins 3515 Nov 12 2014 .bashrc 
-rw-r--r-- 1 jenkins jenkins 675 Nov 12 2014 .profile 
drwxr-xr-x 2 jenkins jenkins 4096 Sep 14 08:50 .tmp 
[email protected]:~# 
+3

あなたのDockerファイルにはどの行が含まれていませんか?完全な出力を表示します。提供されたファイルはステップ12にあるべきではないからです。また、apt-get installとは別の実行行でapt-get updateを実行しないでください。そのための[ベストプラクティス](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#run)エントリがあります。 – BMitch

+0

Jenkinsがスレーブをビルドしようとしているようです。あなたは[Dockins](http://dockins.github.io/)をチェックしたいかもしれません。それはまだ開発の初期段階ですが、あなたにいくつかのアイデアを与えるかもしれません。 – R0MANARMY

答えて

3

私は親画像、jenkinsci/jnlp-slaveを引き出し、そしてdocker inspect jenkinsci/jnlp-slaveでそれを調べる場合は、私ができますそれはすでに/home/jenkinsで定義されたボリュームを持っていることを参照してください。

[ 
    { 
     ... 
     "ContainerConfig": { 
      ... 
      "Volumes": { 
       "/home/jenkins": {} 
      }, 
     ... 
    } 
] 

これは、各ビルドステップの間に、その場所にあなたが加えた変更は、Cではないことを意味しますあなたの新しい層に追い込まれる。

ここで何が起こっているのか強調するために、あなたのDockerfileの簡易版です:docker build --no-cache --rm=false -t jns .

FROM jenkinsci/jnlp-slave 
RUN mkdir -p /home/jenkins/.ssh 

それでは、次のコマンドで作成してみましょう

Sending build context to Docker daemon 2.56 kB 
Step 1 : FROM jenkinsci/jnlp-slave 
---> d7731d944ad7 
Step 2 : RUN mkdir -p /home/jenkins/.ssh 
---> Running in 520a8e2f7cae 
---> 962189878d5e 
Successfully built 962189878d5e 

--no-cacheオプションがにコマンドが容易になります繰り返しの呼び出しで動作します。 --rm=falseは、ビルダが各ステップごとに作成されたコンテナを削除しないようにします。

この場合、ビルダーは私のシステムで520a8e2f7caeのステップ2を実行しました。 docker inspect 520a8e2f7caeを実行し、実際のコンテナをこのステップで使用することができます。具体的には、私は、マウントの位置についての興味:

[ 
    { 
    ... 
    "Mounts": [ 
     { 
     "Name": "e34fd82bd190f21dbd63b5cf70167a16674cd00d95fdc6159314c25c6d08e10e", 
     "Source": "/var/lib/docker/volumes/e34fd82bd190f21dbd63b5cf70167a16674cd00d95fdc6159314c25c6d08e10e/_data", 
     "Destination": "/home/jenkins", 
     "Driver": "local", 
     "Mode": "", 
     "RW": true, 
     "Propagation": "" 
     } 
    ], 
    ... 
    } 
] 

私は/home/jenkinsのID e34fd82bd190f21dbd63b5cf70167a16674cd00d95fdc6159314c25c6d08e10eとの匿名のボリュームがあることを参照してください。

私はこのようにそのボリュームの内容を調べることができます:RUNステップで作成した

$ docker run --rm -v e34fd82bd190f21dbd63b5cf70167a16674cd00d95fdc6159314c25c6d08e10e:/volume alpine ls -lah /volume 
total 28 
drwxr-xr-x 4 10000 10000  4.0K Oct 18 02:49 . 
drwxr-xr-x 25 root  root  4.0K Oct 18 02:55 .. 
-rw-r--r-- 1 10000 10000  220 Nov 12 2014 .bash_logout 
-rw-r--r-- 1 10000 10000  3.4K Nov 12 2014 .bashrc 
-rw-r--r-- 1 10000 10000  675 Nov 12 2014 .profile 
drwxr-xr-x 2 10000 10000  4.0K Oct 18 02:49 .ssh 
drwxr-xr-x 2 10000 10000  4.0K Sep 14 08:50 .tmp 

.sshディレクトリには、このボリュームです。ボリュームはコンテナの書込み層の一部ではないため、コミットされません。私は、このコンテナにdocker diffをすることによってこれを確認することができます

docker diff 520a8e2f7cae 

は何も出力は、それが画像のこの層の中に前方に来ない理由であるコンテナのファイルシステム、への変更を示さない、ありません。

この場所の他のコンテンツは、ボリュームに/home/jenkinsを作成したVOLUMEディレクティブの前にコミットされた親イメージのファイルです。

+0

よろしくお願いします! ...作成されたフォルダを取得するために、Dockerfilesを経由して、ボリュームがマウントされている場所を見つけ出し、mkdir /home/jenkins/.sshコマンドを実行する前に移動しました。 – Johnny5

+0

別のオプションは、ENTRYPOINTボリューム内の.sshフォルダーに移入するスクリプト。そうすれば、親イメージを変更する必要はありません。 – programmerq

関連する問題