如何在kubernetes容器init上访问图像内容

时间:2019-05-19 22:08:09

标签: shell kubernetes containers init

我有一个映像,其中包含/ usr / data / webroot中的数据。此数据应在容器初始化时移至/ var / www / html。

现在我对InitContainers感到沮丧。据我了解,它可用于执行容器初始化上的任务。

但是我不知道在创建amo-magento吊舱之后任务是否被执行,或者是否运行了init任务,以及在创建magento吊舱之后。

我假设initContainers任务运行时,带有magento图像的容器不可用,因此没有内容可移到新目录。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: amo-magento
  labels:
    app: amo-magento
spec:
  replicas: 1
  selector:
    matchLabels:
      app: amo-magento
  template:
    metadata:
      labels:
        app: amo-magento
        tier: frontend
    spec:
      initContainers:
        - name: setup-magento
          image: busybox:1.28
          command: ["sh", "-c", "mv -r /magento/* /www"]

          volumeMounts:
            - mountPath: /www
              name: pvc-www

            - mountPath: /magento
              name: magento-src

      containers:
        - name: amo-magento
          image: amo-magento:0.7 # add google gcr.io path after upload
          imagePullPolicy: Never

          volumeMounts:
            - name: install-sh
              mountPath: /tmp/install.sh
              subPath: install.sh

            - name: mage-autoinstall
              mountPath: /tmp/mage-autoinstall.sh
              subPath: mage-autoinstall.sh

            - name: pvc-www
              mountPath: /var/www/html

            - name: magento-src
              mountPath: /usr/data/webroot

            # maybe as secret - can be used as configMap because it has not to be writable
            - name: auth-json
              mountPath: /var/www/html/auth.json
              subPath: auth.json

            - name: php-ini-prod
              mountPath: /usr/local/etc/php/php.ini
              subPath: php.ini

#            - name: php-memory-limit
#              mountPath: /usr/local/etc/php/conf.d/memory-limit.ini
#              subPath: memory-limit.ini

      volumes:
        - name: magento-src
          emptyDir: {}

        - name: pvc-www
          persistentVolumeClaim:
            claimName: magento2-volumeclaim

        - name: install-sh
          configMap:
            name: install-sh

        # kubectl create configmap mage-autoinstall --from-file=build/docker/mage-autoinstall.sh
        - name: mage-autoinstall
          configMap:
            name: mage-autoinstall

        - name: auth-json
          configMap:
            name: auth-json

        - name: php-ini-prod
          configMap:
            name: php-ini-prod

#        - name: php-memory-limit
#          configMap:
#            name: php-memory-limit

1 个答案:

答案 0 :(得分:1)

  

但是我不知道在创建amo-magento吊舱之后任务是否被执行,或者是否运行了init任务,以及在创建magento吊舱之后。

可以肯定的是,这就是为什么您可以为您的image:任务指定完全不同的 initContainers:的原因-它们彼此之间只有相互关联,如您所见,在同一节点上运行并共享卷。好吧,我说“肯定”,但是您有一个错误的用词:在创建magneto 容器之后– Pod是每个的集合容器,initContainers:container:容器

如果我理解您的问题,则对Deployment的修复只是将image:中的initContainer:更新为包含魔法/usr/data/webroot的那个{更新您的shell命令以引用该图像内的正确路径:

  initContainers:
    - name: setup-magento
      image: your-magic-image:its-magic-tag
      command: ["sh", "-c", "mv -r /usr/data/webroot/* /www"]
      volumeMounts:
        - mountPath: /www
          name: pvc-www
        # but **removing** the reference to the emptyDir volume

然后在container[0]启动时,PVC将包含您期望的数据


也就是说,我实际上很确定您要从此故事中删除PVC,因为-根据定义-它在Pod重新启动后是持久的,因此只会随着时间的推移累积文件(因为您的sh命令当前无法在将文件移至其中之前清除/www)。如果您将所有pvc引用替换为emptyDir: {}引用,则这些目录将始终是“新鲜”的,并且将仅包含initContainer: