如何手动向Docker镜像添加文件?Ruby on Rails容器启动异常求助
解决Docker镜像缺失目录的问题
嘿,刚接触Docker遇到这种问题太正常了,我来帮你理清楚怎么搞定!
首先得搞明白为啥你手动创建的目录一退出容器就没了:Docker的镜像其实是由多个只读层堆叠而成的,当你用docker run启动容器时,会在镜像上层加一个可写临时层——你在容器里做的所有修改(比如创建目录)都只存在这个临时层里。一旦容器停止或被删除,这个临时层的内容就会被清理,原镜像根本不会被改动,所以下次启动新容器时还是会缺那个目录。
那怎么才能把目录永久加到镜像里呢?有两种方法,推荐第一种(更规范、可维护):
方法一:修改Dockerfile重新构建(推荐)
这是Docker的标准做法,因为Dockerfile是镜像的“配置源代码”,修改它能保证你的镜像配置可重复、可追溯。
- 打开你的Dockerfile,在合适的位置(比如安装完Ruby、Rails依赖之后,启动命令之前)添加一行:
把RUN mkdir -p /path/to/your/missing/directory/path/to/your/missing/directory替换成你实际缺失的目录路径,-p参数是为了自动创建不存在的父目录。 - 重新构建镜像:
这里docker build -t your-rails-image:latest .your-rails-image是你原来的镜像名称,构建完成后,新镜像里就永久包含这个目录了,再启动容器就不会有问题。
方法二:提交容器为新镜像(临时应急用)
如果你只是临时解决问题,不想重新构建镜像,可以把修改后的容器提交成一个新镜像:
- 先启动容器并进入shell:
docker run -it your-rails-image sh - 在容器里创建缺失的目录:
mkdir -p /path/to/your/missing/directory - 不要退出这个终端,打开另一个终端,查看当前运行的容器ID:
docker ps - 用容器ID提交新镜像:
这里docker commit <容器ID> your-rails-image:updated<容器ID>替换成你刚才查到的ID,updated是新镜像的标签,方便区分。 - 之后用这个新镜像启动容器:
docker run -d your-rails-image:updated
最后提个小建议:Ruby 1.9.3已经是非常老旧的版本了,不仅没有安全更新,很多现代依赖也不兼容,如果项目允许的话,建议慢慢升级到更高版本的Ruby,能避免很多潜在问题~
内容的提问来源于stack exchange,提问作者Alexander Vishnevskii
相关产品推荐
相关产品推荐

