Init container容器Volume文件复制脚本(共享存储)

本文介绍了在Kubernetes中,为了避免卷挂载时隐藏原有文件,如何利用Init Container和辅助容器实现文件复制以更新共享存储中的文件。通过创建一个复制文件的脚本,并在1.3版本的Init Container中使用,确保文件替换过程顺利完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Deprecated


1、由于卷的挂载是直接在容器当前目录之上的,即容器原本目录下文件被隐藏,等umount才可见,因此,如果不希望发生把原本目录下的文件也影藏掉,需要通过复制容器,两个容器共享存储,然后通过向辅助容器挂载volume,然后通过这个容器,把新挂载的文件copy到共享目录,完成文件替换。





2、复制文件的脚本(/volume,/share为辅助容器下目录,即使和应用容器同名也不会影响)    。。。其实简单的一句  copy /volume/* /share 就够了(最初考虑通过参数传入两个目录)


#!/bin/sh
vs="volume is empty!"
ss="sharedir is empty!"
volume="/volume"
share="/share"
#get the file from the volume and copy all of them to the share directory
set -e
echo ">volume path:"$volume
echo ">shareDir:"$share
echo "-----------"
if [ ! -z "$volume" ];then
 if [ ! -d "$volume" ];then
  echo "  [$volume] is't a directory,exit ..."
  exit 0
 fi
else
 echo "  no volume assigned,exit ..."
 exit 0
fi
if [ ! -z "$share" ];then
 if [ ! -d "$share" ];then
  echo "  [$share] isn't a directory,exit ..."
  exit 0
 fi
else
 echo "  no sharedir assigned,exit ..."
 exit 0
fi
#copying start
echo ">>$volume before copy:"
ls $volume
echo ">>$share before copy"
ls $share
cp $volume/* $share/
echo "------------"
if [ $? -eq 0 ];then
 echo ">copy success!"
 echo ">> $share after copy:"

3、Kubernetes1.3版本init container的初始化容器方式还处于alpha阶段,需要荣国annotation的形式生命在pod中,备份yaml文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-init
  annotations:
    pod.alpha.kubernetes.io/init-containers: '[
        {
            "name": "install",
            "image": "{repository}/library/initcontainer:1.1",
            "command": ["/bin/sh", "-c", "/run.sh /share /work-dir"],
            "volumeMounts": [
                {
                    "name": "volume",
                    "mountPath": "/volume"
                },
                {
                     "name":"workdir",
                     "mountPath":"/share"
                }
            ]
        }
    ]'
spec:
  containers:
  - name: nginx
    image: {repository}/library/nginx:1.9.14-alpine
    ports:
    - containerPort: 80
    volumeMounts:
    - name: workdir
      mountPath: /usr/share/nginx/daata
  dnsPolicy: Default
  volumes:
  - name: workdir
    emptyDir: {}
  - name : volume
    hostPath:
     path: /home/mypace
/hostpath

4、辅助容器Dockerfile备份(from busybox,该镜像比较小,但是能够执行基本的sh命令)

FROM {repository}/library/busybox:1.24

COPY run.sh /
RUN chmod +x /run.sh

CMD ["/bin/sh", "-c", "/run.sh"]
5、如何运行多进程的容器
while [[ true ]]; do
sleep 1
done
一种方法是使用Shell脚本,另一种方法是使用进程管理工具Supervisor 详细

<think>好的,用户需要一个贴近实际工作的初始化容器Init Container)的YAML示例。首先,我需要回忆一下Kubernetes中Init Container的作用。它们用于在主容器启动之前执行一些准备任务,比如等待依赖服务就绪、初始化数据库或者下载配置文件等。 用户可能是在部署应用时遇到了依赖问题,比如主容器需要某个服务或资源准备好才能启动。他们需要一个具体的例子来参考如何配置。这时候,我应该考虑一个常见的场景,比如等待数据库服务可用,或者初始化数据。 接下来,我需要确保示例的YAML结构正确,包括apiVersion、kind、metadata、spec等部分。在spec里,要包含initContainerscontainers两部分。可能需要使用到命令如curl或nc来检查依赖服务是否就绪。 还要考虑实际工作中的常见工具和命令,比如使用curl循环检测数据库端口是否开放,或者用nc检查服务可达性。同时,资源限制和请求也是实际配置中常用的,需要包括进去。 用户可能希望示例尽可能贴近真实,所以需要注释说明每个部分的作用,比如initContainer的作用,主容器的配置,以及卷的挂载(如果有的话)。例如,初始化容器完成配置文件的下载,主容器挂载这个卷来读取配置。 另外,要注意语法正确性,比如缩进、括号匹配,以及使用的镜像是否合理。比如使用curl的镜像,或者自定义的初始化脚本镜像。 最后,总结一下这个示例的用途,帮助用户理解何时以及如何使用初始化容器,确保他们在实际工作中能正确应用。</think>以下是一个贴近实际工作场景的初始化容器YAML示例,演示了主容器启动前执行数据库迁移和配置文件下载的操作: ```yaml apiVersion: v1 kind: Pod metadata: name: web-application labels: app: web spec: initContainers: - name: db-migration image: company-registry/db-migrator:1.4.2 command: ['sh', '-c', 'until nc -z mysql-service 3306; do echo "等待MySQL就绪..."; sleep 2; done; ./run-migrations.sh'] env: - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password resources: requests: memory: "128Mi" cpu: "100m" - name: config-downloader image: curlimages/curl:8.00.1 command: ['sh', '-c', 'curl -o /config/app-settings.yaml https://config-server/prod/app-settings.yaml'] volumeMounts: - name: config-volume mountPath: /config containers: - name: web-server image: company-registry/web-app:3.1.0 ports: - containerPort: 8080 volumeMounts: - name: config-volume mountPath: /etc/app/config readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 10 periodSeconds: 5 volumes: - name: config-volume emptyDir: {} ``` 关键要素说明: 1. **双初始化容器工作流**: - `db-migration`:使用企业私有镜像,持续检测MySQL服务可用性(通过`nc`命令),成功后执行数据库迁移脚本 - `config-downloader`:使用官方curl镜像,从配置服务器下载运行时配置文件 2. **典型生产环境特征**: - 使用Secret管理敏感数据(数据库密码) - 资源请求配置(防止资源抢占) - 就绪探针配置(Readiness Probe) - 卷共享(emptyDir卷在init容器和主容器之间共享配置) 3. **实际工作常用模式**: - 服务依赖检测(MySQL服务就绪检查) - 配置预下载(避免将配置打包进镜像) - 有序执行(按声明顺序执行init容器) 4. **安全增强**: - 使用特定版本标签(而非latest) - 最小化镜像使用(curl镜像仅6MB) - 权限隔离(每个init容器职责单一) 此配置适用于需要满足以下条件的场景: 1. 主服务启动前必须完成数据库变更 2. 运行时配置需要从外部系统动态获取 3. 需要确保依赖服务已就绪 4. 需要保证配置文件的可用性 实际使用时需根据具体需求调整: - 检测命令(可替换为专用健康检查客户端) - 超时机制(增加超时退出逻辑) - 重试策略(更完善的错误处理) - 文件校验(添加checksum验证)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值