1

我正在尝试调整基于 Kubernetes 的应用程序,使其对开发更加友好。我kustomize用来将一些额外的容器添加到我的app-deployment. 它看起来像这样:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  template:
    spec:
      volumes:
        - name: php-src
          emptyDir: {}
        - name: nginx-src
          emptyDir: {}
        - name: webpack-src
          emptyDir: {}
      containers:
        - name: lsyncd
          image: axiom/rsync-server
          ports:
            - name: sshd
              containerPort: 22
            - name: rsyncd
              containerPort: 873
          env:
            - name: USERNAME
              value: user
            - name: PASSWORD
              value: pass
          volumeMounts:
            - name: php-src
              mountPath: /data/php
            - name: nginx-src
              mountPath: /data/nginx
            - name: webpack-src
              mountPath: /data/webpack
        - name: nginx
          volumeMounts:
            - name: nginx-src
              mountPath: /app
        - name: php
          volumeMounts:
            - name: php-src
              mountPath: /app
        - name: webpack
          image: dreg.mpen.ca/kymark/webpack
          imagePullPolicy: Never  # https://stackoverflow.com/a/54043058/65387
          ports:
            - name: http
              containerPort: 8082
          livenessProbe:
            httpGet:
              port: http
              path: /assets/manifest.json
            initialDelaySeconds: 20
            periodSeconds: 60
          command: ['node','--max_old_space_size=20000','node_modules/.bin/webpack-dev-server']
          volumeMounts:
            - name: webpack-src
              mountPath: /app

基本上,我添加了一个新的 rsync 服务器,其中包含 3 个卷,对应于我要上传代码的 3 个不同容器。这部分工作得很好;我可以将我的代码同步到容器中,它会立即显示出来。

/app但是,nginx、PHP 和 webpack 映像在该目录中已经有一些代码(如node_modulesvendor)。当我安装在它的顶部时,它会消失(这是有道理的,因为我正在安装一个emptyDir)。但我想做的是使用覆盖安装,这样我上传的任何代码都将“覆盖”在已经存在的内容之上。

我可以这样做吗?如何?

4

1 回答 1

2

不,Kubernetes挂载与Docker挂载不同,它不允许将一个目录挂载到另一个目录之上。势VOLUME线从Dockerfile无所谓。

您的用例的一个常见解决方案是,在主容器启动之前使用init 容器设置emptyDir。因此,基本上您在init 容器主容器中都将 指定为卷挂载,并让init 容器将文件复制到.emptyDiremptyDir

此外,有两个项目可以为您尝试实现的目标提供不同的解决方案:

使用其中之一,您不需要在叠加层中设置自定义rsync初始化容器。

于 2020-07-28T06:55:26.737 回答