【发布时间】:2020-07-10 08:29:16
【问题描述】:
我有一个运行两个容器的部署。其中一个容器尝试构建(在部署期间)另一个容器 nginx 尝试服务的 javascript 包。
我想在构建后使用共享卷来放置 javascript 包。
到目前为止,我有以下部署文件(删除了不相关的部分):
apiVersion: apps/v1
kind: Deployment
metadata:
...
spec:
...
template:
...
spec:
hostNetwork: true
containers:
- name: personal-site
image: wheresmycookie/personal-site:3.1
volumeMounts:
- name: build-volume
mountPath: /var/app/dist
- name: nginx-server
image: nginx:1.19.0
volumeMounts:
- name: build-volume
mountPath: /var/app/dist
volumes:
- name: build-volume
emptyDir: {}
尽我所能,我遵循了以下指南:
- https://kubernetes.io/docs/concepts/storage/volumes/#emptydir
- https://kubernetes.io/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/
要指出的另一件事是,我正在尝试使用 minikube 在本地运行此 atm。
编辑:我用来构建此映像的 Dockerfile 是:
FROM node:alpine
WORKDIR /var/app
COPY . .
RUN npm install
RUN npm install -g @vue/cli@latest
CMD ["npm", "run", "build"]
我意识到当我实际运行映像时我不需要构建它,但我的下一个目标是将 pod 实例信息作为环境变量插入,所以不幸的是,使用 javascript 我只能在该信息可用时构建。
问题
personal-site 容器的日志显示:
- Building for production...
ERROR Error: EBUSY: resource busy or locked, rmdir '/var/app/dist'
Error: EBUSY: resource busy or locked, rmdir '/var/app/dist'
我不确定构建为什么要尝试删除/dist,但也有一种感觉,这无关紧要。我可能是错的?
我认为这可能与容器/卷的生命周期有关,但文档建议“一个 emptyDir 卷是在将 Pod 分配给节点时首先创建的,并且只要该 Pod 在其上运行就存在那个节点”。
问题
在容器已经运行后,我可能无法使用某个卷的原因有哪些?鉴于您在 Kubernetes 方面的经验可能比我多得多,接下来您会考虑什么?
【问题讨论】:
-
为什么不在你的镜像的 Dockerfile 中运行这个构建序列,只在构建时运行一次,而不是在每个副本重新运行一次,然后在 Pod 重新启动时再次重新运行它?跨度>
-
rmdir '/var/app/dist'可能看起来没有必要,但就构建顺序而言,该步骤失败(因为该目录上已安装某些内容,因此无法删除)并且一次该步骤失败,构建完成。更完整地描述wheresmycookie/personal-site:3.1图像的作用会有所帮助。 -
@DavidMaze 我很想在 javascript 构建中插入有关 pod 实例的信息,仅此而已。我将更新问题以包含 Dockerfile!
标签: kubernetes