将JHipster容器修改提交至Docker镜像失败问题求助
解决方法:正确保存JHipster容器修改为镜像
一、先排查问题根源
你遇到的问题大概率是以下两个原因之一:
- 卷挂载导致修改未存在于容器可写层:如果你运行原镜像时用了
-v参数将宿主机目录挂载到/home/jhipster/app,你的修改其实存在宿主机而非容器内部,docker commit只会保存容器自身的可写层变更,不会包含卷内容。 - 官方镜像启动时重置目录:JHipster官方镜像可能自带启动脚本,每次容器启动时会从预设模板目录复制内容到
/home/jhipster/app,覆盖你之前的修改。
二、临时解决方案:用docker commit正确保存修改
如果只是临时保存修改,按照以下步骤操作:
- 重新运行容器,不挂载外部卷:
运行命令时不要加-v相关参数,确保/home/jhipster/app是容器内部的目录:docker run -it --name jhipster-temp jhipster/jhipster bash - 在容器内完成修改:
进入容器后执行你的操作,比如运行./mvnw、修改代码等,确认修改后的内容在/home/jhipster/app下正常存在。 - 提交修改为新镜像:
打开新终端,先查看容器ID:
然后提交:docker ps -adocker commit jhipster-temp jhipster-image-template - 测试新镜像:
运行新镜像时同样不要挂载卷,验证修改是否保留:
此时查看docker run -it jhipster-image-template bash/home/jhipster/app应该能看到你的修改。
三、推荐方案:用Dockerfile构建可维护镜像
docker commit的方式不透明,无法追溯修改内容,推荐用Dockerfile来构建镜像,步骤如下:
- 创建Dockerfile文件:
在本地目录新建Dockerfile,内容示例:# 基于官方JHipster镜像 FROM jhipster/jhipster:latest # 设置工作目录 WORKDIR /home/jhipster/app # 执行你需要的修改操作,比如运行mvn构建 RUN ./mvnw clean install -DskipTests # 如果是本地有修改的源代码,可复制到容器内(假设本地代码在./app子目录) # COPY ./app /home/jhipster/app # 覆盖默认启动行为(如果官方启动脚本会重置目录) CMD ["bash"] - 构建镜像:
在Dockerfile所在目录执行:docker build -t jhipster-image-template . - 运行测试:
此时你的修改会被固化在镜像中,每次启动都能保留。docker run -it jhipster-image-template bash
四、额外注意事项
- 如果官方镜像的启动脚本确实会重置
/home/jhipster/app,你需要在Dockerfile中修改或替换这个脚本。可以先进入原容器查看启动脚本位置(通常在/entrypoint.sh或类似路径),然后在Dockerfile中覆盖它:# 复制自定义的启动脚本到容器 COPY ./my-entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] - 尽量避免用
docker commit做长期镜像维护,Dockerfile更利于版本控制和团队协作。
内容的提问来源于stack exchange,提问作者Amir Choubani
相关产品推荐
相关产品推荐

