使用Kompose运行Rails应用遇卷挂载问题,能否构建含应用文件的容器?
Kompose部署Docker Compose应用时容器崩溃,无法找到应用目录文件
我为自己的应用创建了docker-compose文件,但在使用Kompose运行时遇到了问题,已知问题出在volumes配置上,但不知如何修复。以下是我的docker-compose配置:
version: '3' services: app: entrypoint: [bin/entry.sh] image: myimage:latest command: rails server -p 3000 -b '0.0.0.0' volumes: - .:/app ports: - "3000:3000" links: - postgres postgres: image: postgres:9.4 ports: - "5432"
执行kompose up后看似一切正常,但app容器持续崩溃,原因是无法找到应用目录下的文件。请问是否可以构建包含这些文件的容器并配合Kompose使用?
解决方案
这个问题我之前也碰到过,核心原因是你在Docker Compose里用的- .:/app本地目录挂载逻辑,在Kubernetes集群环境下并不适用——Kompose会把这个卷转换成Kubernetes的Volume配置,但集群里的节点并没有你本地的应用代码,所以容器启动后自然找不到文件。
当然可以把应用文件直接构建到镜像里来解决这个问题,这也是容器化部署的最佳实践,具体步骤如下:
1. 编写/修改Dockerfile,把应用代码打包进镜像
假设你还没有Dockerfile,或者需要调整现有Dockerfile,添加COPY步骤把本地代码复制到容器的/app目录:
# 基于你原来的基础镜像 FROM myimage:latest # 设置工作目录为/app WORKDIR /app # 把当前目录的所有文件复制到容器的/app下 COPY . . # 如果是Rails应用,记得添加依赖安装步骤(比如bundle install) # RUN bundle install # 保留原来的入口命令 ENTRYPOINT ["./bin/entry.sh"] CMD ["rails", "server", "-p", "3000", "-b", "0.0.0.0"]
2. 重新构建镜像
执行构建命令,更新你的myimage:latest镜像:
docker build -t myimage:latest .
3. 修改docker-compose.yml,移除本地卷挂载
既然代码已经打包进镜像了,就不需要再挂载本地目录了,修改后的配置如下:
version: '3' services: app: entrypoint: [bin/entry.sh] image: myimage:latest command: rails server -p 3000 -b '0.0.0.0' ports: - "3000:3000" links: - postgres postgres: image: postgres:9.4 ports: - "5432"
4. 重新用Kompose部署
现在可以重新执行Kompose命令来部署了:
kompose up
额外说明
如果你的应用需要持久化某些动态文件(比如上传的静态资源、日志),可以单独为这些目录配置Kubernetes的PersistentVolumeClaim(PVC),但应用代码本身一定要打包进镜像,这样才能保证在集群的任意节点上启动容器都能正常运行。
内容的提问来源于stack exchange,提问作者michaeff
相关产品推荐
相关产品推荐

