在发布这个问题之前,我遵循了这个答案How to mimic '--volumes-from' in Kubernetes,但它对我不起作用。
我有两个容器:
*node:其镜像包含与应用相关的所有文件(/var/www
内部)
*nginx:需要访问node镜像里面的文件(特别是我所有资产所在的/clientBuild
文件夹)
节点镜像内部内容:
$ docker run node ls -l
> clientBuild/
> package.json
> ...
字符串nginx.prod.conf
的一部分:
location ~* \.(jpeg|jpg|gif|png|ico|css|js|gz|map|json)$ {
include /etc/nginx/mime.types;
root /usr/local/nginx/html/clientBuild/;
}
型
以及部署设置:
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: pwa-app-production
labels:
app: MyApp
spec:
replicas: 1
template:
metadata:
name: app
labels:
app: MyApp
env: production
spec:
containers:
- name: nginx
image: nginx
command: [nginx, -c, /nginx.prod.conf, -g, 'daemon off;']
resources:
limits:
memory: "500Mi"
cpu: "100m"
imagePullPolicy: Always
volumeMounts:
- mountPath: /usr/local/nginx/html
name: pwa-disk
readOnly: true
ports:
- name: nginx
containerPort: 80
initContainers:
- name: node
image: node
command: [npm, start]
resources:
limits:
memory: "500Mi"
cpu: "100m"
imagePullPolicy: Always
volumeMounts:
- mountPath: /var/www
name: pwa-disk
ports:
- name: app
containerPort: 3000
- name: api
containerPort: 3001
volumes:
- name: pwa-disk
emptyDir: {}
型
我第一次尝试将两个图像放在同一个containers
键中,但我得到了:npm start
上的/var/www/package.json not found
然后我把它移到initContainers
里面,但现在我只有一个通知,它失败了,但它没有告诉我为什么。查看日志也不显示任何详细信息。
请注意,当我删除卷部分时,npm start
工作正常。
的数据
2条答案
按热度按时间qvk1mo1f1#
我假设您的资产已经打包在
/var/www
的映像中。如果您在该路径上挂载一个emptyDir
卷,那么那里的所有内容都将被emptyDir
卷的内容覆盖-最初它什么都没有。这意味着您的所有资产都将通过该装载删除-这就是您的节点服务器最有可能失败的原因。您要做的是将
emptyDir
卷挂载到其他路径,比如/data
。然后用cp -r /var/www/* /data
覆盖节点容器cmd,以将资源复制到pwa-disk
卷中。现在,您可以将此卷挂载到nginx容器中。我认为对
initContainers
的工作原理存在误解。它们注定要终结。它们运行之前运行任何其他容器-在你的initContainers
成功终止之前,你的pod中没有其他容器被启动。因此,您可能不希望将节点服务器作为initContainer
启动。我猜你的节点服务器不应该终止,在这种情况下你的nginx容器永远不会启动。相反,您可能希望在containers
部分中将节点服务器和nginx一起声明。此外,您还可以将具有覆盖cmd(cp -r /var/www/* /data
)的节点容器添加到initContainers
部分,以将资源复制到卷中。整个事情看起来可能是这样的:字符串
rsl1atfo2#
我刚刚在kubernetes中遇到了
shareProcessNamespace
,并认为这将非常适合这个用例。请参阅:https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/
字符串
在这个例子中,我们有一个数据容器,只是把一个空文件放在
/DATA
中,另一个容器(在这个例子中是nginx)通过在/proc
中找到第二个PID
来创建一个symlink
。这是可行的,因为数据容器是容器数组中的第一个,并且必须在
shareProcessNamespace
中具有第二个PID
。