更新:minikubevmに接続し、ホストディレクトリがマウントされているのを確認しましたが、ファイルがありません。また、そこでファイルを作成した場合、ホストマシンにはありません。それらの間にリンクがあります
私は、kubernetesでアプリを開発するためにホストディレクトリをマウントしようとしています。
ドキュメントが推奨するように、私は自分のPCでkubernetesクラスターを実行するためにminikubeを使用しています。目標は、私のアプリを開発するためのdockerとkubernetesを備えた開発環境を作成することです。ローカルディレクトリをマウントして、Dockerがそこからコードアプリを読み取るようにしたいと考えています。しかし、それはうまくいきません。どんな助けでも本当に感謝します。
私のテストアプリ(server.js):
var http = require('http');
var handleRequest = function(request, response) {
response.writeHead(200);
response.end("Hello World!");
}
var www = http.createServer(handleRequest);
www.listen(8080);
私のDockerfile:
FROM node:latest
WORKDIR /code
ADD code/ /code
EXPOSE 8080
CMD server.js
私のポッドkubernetes構成:(pod-configuration.yaml)
apiVersion: v1
kind: Pod
metadata:
name: apiserver
spec:
containers:
- name: node
image: myusername/nodetest:v1
ports:
- containerPort: 8080
volumeMounts:
- name: api-server-code-files
mountPath: /code
volumes:
- name: api-server-code-files
hostPath:
path: /home/<myuser>/Projects/nodetest/api-server/code
私のフォルダは:
/home/<myuser>/Projects/nodetest/
- pod-configuration.yaml
- api-server/
- Dockerfile
- code/
- server.js
HostPathボリュームなしでdockerイメージを実行すると、もちろん機能しますが、問題は、変更するたびに、開発にはあまり強力でないイメージを再作成する必要があることです。そのため、ボリュームhostPathが必要です。
何か案が ?ローカルディレクトリをマウントできないのはなぜですか?
助けてくれてありがとう。
編集:解決策は 特権コンテナー を使用するか、手動でホームフォルダーをマウントしてMiniKube VMがhostPathから読み取ることができるようにすることです-- https://github.com/boot2docker/boot2docker#virtualbox-guest-additions 。(これを理解するにはElielにクレジットしてください)。
HostPathボリュームをminikubeで構成することは完全に可能ですが、多くの癖があり、この特定の問題に対するサポートはあまりよくありません。
DockerfileからADD code/ /code
を削除してみてください。 Dockerの「ADD」命令 は、ホストマシンからコンテナの/code
ディレクトリにコードをコピーしています。これが、イメージを再構築するとコードが正常に更新される理由です。
Kubernetesがコンテナの/code
ディレクトリをホストパスにマウントしようとすると、このディレクトリには、イメージに焼き付けられたコードがすでにいっぱいであることがわかります。これをビルドステップから外すと、Kubernetesは実行時にホストパスを正常にマウントできるはずです。
また、ホストマシンのcode/
ディレクトリの権限を確認してください。
私の他の唯一の考えは、ルートディレクトリへのマウントに関するものです。ルートディレクトリのディレクトリとの間でKubernetes hostPathボリュームをマウントするときに問題が発生しました(これはアクセス許可に関連していると思います)。したがって、/var/www/html
のようなmountPathを試してみてください。
次に、機能するhostPathボリュームの例を示します。
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
volumes:
- name: example-volume
hostPath:
path: '/Users/example-user/code'
containers:
- name: example-container
image: example-image
volumeMounts:
- mountPath: '/var/www/html'
name: example-volume
彼らは今、minikube mount
すべての環境で機能します
https://github.com/kubernetes/minikube/blob/master/docs/Host_folder_mount.md
Macで試した:
$ minikube mount ~/stuff/out:/mnt1/out
Mounting /Users/macuser/stuff/out into /mnt1/out on the minikube VM
This daemon process needs to stay alive for the mount to still be accessible...
ufs starting
そしてポッドで:
apiVersion: v1
kind: Pod
metadata:
name: myServer
spec:
containers:
- name: myServer
image: myImage
volumeMounts:
- mountPath: /mnt1/out
name: volume
# Just spin & wait forever
command: [ "/bin/bash", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
volumes:
- name: volume
hostPath:
path: /mnt1/out