在发布此问题之前,我遵循了这个答案How to mimic '--volumes-from' in Kubernetes,但它对我不起作用。
我有2个容器:
/var/www
内)/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
密钥中,但我得到/var/www/package.json not found
上的npm start
然后我把它移到了initContainers
里面,但现在我只注意到它失败了,但它并没有告诉我原因。查看日志也不会显示任何详细信息。
请注意,当我删除音量部分时,npm start
可以正常工作。
答案 0 :(得分:4)
我认为您的资产已经打包在/var/www
的图片中。如果您在该路径上安装emptyDir
卷,那么所有内容都会被emptyDir
卷的内容覆盖 - 最初什么都不是。这意味着您的所有资产都将通过该挂载删除 - 这就是您的节点服务器很可能失败的原因。
您要做的是将emptyDir
卷安装在其他路径上,例如/data
。然后,您使用cp -r /var/www/* /data
覆盖节点容器cmd,将资产复制到pwa-disk
卷中。现在,您可以将此卷装入nginx容器中。
我认为对initContainers
的工作方式存在误解。他们打算终止。他们运行 BEFORE 启动任何其他容器 - 在您的initContainers
成功终止之前,您的pod中没有其他容器启动。因此,您很可能不希望将节点服务器作为initContainer
启动。我猜你的节点服务器不应该终止,在这种情况下你的nginx容器永远不会启动。相反,您可能希望在containers
部分中将您的节点服务器与您的nginx一起声明。此外,您还可以将带有覆盖cmd(cp -r /var/www/* /data
)的节点容器添加到initContainers
部分,以将资产复制到卷。整个事情可能看起来像那样:
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
- name: node
image: node
command: [npm, start]
resources:
limits:
memory: "500Mi"
cpu: "100m"
imagePullPolicy: Always
ports:
- name: app
containerPort: 3000
- name: api
containerPort: 3001
initContainers:
- name: assets
image: node
command: [bash, -c]
args: ["cp -r /var/www/* /data"]
imagePullPolicy: Always
volumeMounts:
- mountPath: /data
name: pwa-disk
volumes:
- name: pwa-disk
emptyDir: {}