如何在Kubernetes容器中配置延迟执行命令完成文件复制?
问题解决步骤
一、修复Kubernetes容器Command语法问题
你之前的两种写法都存在问题,具体原因和修正方案如下:
- 第一种写法中,
args的两个字符串会被bash当作独立的命令与参数,执行完sleep 30后bash直接退出,不会执行后续的cp命令。 - 第二种写法语法本身正确,但容器执行完
cp命令后会立即终止——因为你用command覆盖了镜像的默认启动命令,容器主进程就是这条bash命令,命令执行完毕进程结束,容器随之崩溃。
正确的做法是:完成文件复制后,启动镜像原本的应用进程。假设该镜像默认启动命令为apache2-foreground(这类PHP应用的常见启动命令),你需要把它加入命令链:
spec: containers: - image: andreask81/syspass:latest name: syspass-app command: ["/bin/bash", "-c"] args: - | sleep 10 && \ cp /var/www/html/sysPass/config/backup/config.xml /var/www/html/sysPass/config/config.xml && \ apache2-foreground
如果不确定镜像默认启动命令,可执行docker inspect andreask81/syspass:latest查看Cmd字段的值,替换到命令末尾即可。
比固定sleep更可靠的方式是循环检测持久卷文件是否存在,避免无效等待:
spec: containers: - image: andreask81/syspass:latest name: syspass-app command: ["/bin/bash", "-c"] args: - | while [ ! -f /var/www/html/sysPass/config/backup/config.xml ]; do sleep 2 done && \ cp /var/www/html/sysPass/config/backup/config.xml /var/www/html/sysPass/config/config.xml && \ apache2-foreground
二、修复脚本换行符错误
脚本出现$'\r': command not found报错,是因为使用了Windows风格的CRLF换行符,而Linux系统仅识别LF换行符。修正方式:
- 用VS Code等编辑器打开脚本,点击右下角换行符标识,切换为
LF后保存。 - Linux环境下执行
dos2unix /tmp/script.sh直接转换。 - 或用sed命令替换:
sed -i 's/\r$//' /tmp/script.sh
修正换行符后,需在脚本末尾添加应用启动命令(比如apache2-foreground),再通过Kubernetes挂载执行:
spec: containers: - image: andreask81/syspass:latest name: syspass-app command: ["/bin/bash", "/tmp/script.sh"] volumeMounts: - name: init-script mountPath: /tmp/script.sh subPath: script.sh volumes: - name: init-script configMap: name: syspass-init-script
(先将脚本创建为ConfigMap:kubectl create configmap syspass-init-script --from-file=script.sh)
内容的提问来源于stack exchange,提问作者Mahmoud Mahany
相关产品推荐
相关产品推荐

