能否将Dockerfile中的ADD与ENTRYPOINT指令迁移至docker-compose?如何操作?
可行,具体操作步骤如下
一、先修改Dockerfile,移除要迁移的指令
将原Dockerfile中的ADD和ENTRYPOINT指令删除,修改后内容如下:
FROM eclipse-temurin:19-jdk-alpine RUN apk add --no-cache maven VOLUME /tmp EXPOSE 5000
二、迁移ENTRYPOINT到docker-compose.yml
在web服务配置下直接添加entrypoint字段,格式与Dockerfile的exec格式保持一致:
entrypoint: ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
三、处理两个ADD指令的迁移
原Dockerfile中的两个ADD指令对应两种不同场景,需分别处理:
1. 处理ADD . .(复制本地目录到镜像)
- 如果是构建镜像时需要复制源码(比如在容器内用Maven打包):由于docker-compose的
build.context已经指定了当前目录作为构建上下文,Dockerfile在构建时会自动获取该目录下的文件,无需额外配置。 - 如果是运行时需要挂载本地源码(开发阶段实时同步代码):在
web服务的volumes中添加挂载配置:volumes: - .:/app # 将本地当前目录挂载到容器内/app目录
2. 处理ADD /target/menu-0.0.1-SNAPSHOT.jar app.jar(复制打包后的JAR包)
推荐用运行时挂载本地JAR包的方式替代构建时复制,这样无需重新构建镜像即可更新JAR,配置如下:
volumes: - ./target/menu-0.0.1-SNAPSHOT.jar:/app.jar # 将本地打包好的JAR挂载到容器内指定路径
四、完整的docker-compose.yml配置
整合所有修改后,最终的docker-compose.yml如下(注意修正了原配置中端口映射的错误,原Dockerfile暴露5000端口):
version: "3" services: web: build: context: . dockerfile: Dockerfile ports: - "80:5000" entrypoint: ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] volumes: # 可选:开发阶段挂载本地源码,取消注释即可 # - .:/app - ./target/menu-0.0.1-SNAPSHOT.jar:/app.jar - /tmp:/tmp # 对应原Dockerfile的VOLUME /tmp配置
注意事项
- 如果必须在容器内执行Maven打包,
ADD . .指令无法完全迁移出Dockerfile,因为构建阶段需要源码文件; - docker-compose中定义的
entrypoint会覆盖Dockerfile里的ENTRYPOINT配置; - 运行时挂载JAR包的方式更适合开发调试,生产环境建议还是将JAR包构建到镜像中(即保留原Dockerfile的ADD指令)。
内容的提问来源于stack exchange,提问作者Stefano Maglione
相关产品推荐
相关产品推荐

