How to copy files from other location into Docker image
我正在尝试将文件从其他位置(在Windows也从共享驱动器的D驱动器中)复制到我的图像中。
但这给了我错误。
Step 5/8 : ADD ${APP_PATH}/${ARTIFACT}-${VERSION} /opt/tomcat/webapps/${ARTIFACT}-${VERSION}
ADD failed: stat /var/lib/docker/tmp/docker-builder990684261/d:/Application_Build/spring-tournament-portal-0.0.1-SNAPSHOT: no such file or directory
场景:
我正在尝试借助docker进行测试,构建,发布阶段循环。
因此,我的多阶段docker文件的第一个版本看起来像这样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | FROM maven as build WORKDIR /usr/local RUN mkdir app COPY . /usr/local/app/spring-tournament-portal/ WORKDIR /usr/local/app/spring-tournament-portal RUN mvn -e package FROM tomcat ENV PORT 8080 ENV VERSION 0.0.1-SNAPSHOT ENV ARTIFACT spring-tournament-portal ENV JPDA_ADDRESS 8000 ENV JPDA_TRANSPORT dt_socket COPY --from=build /usr/local/app/${ARTIFACT}/target/${ARTIFACT}-${VERSION} /usr/local/tomcat/webapps/${ARTIFACT}-${VERSION} WORKDIR /usr/local/tomcat/bin CMD ["catalina.sh jpda run"] EXPOSE ${PORT} |
但是在每个构建中,maven都会获取其依赖项。因此,这花费了太多时间。
所以我提出了另一种方法。我创建了两个docker文件(一个用于构建,另一个用于发布)。
在这里,构建docker文件的作用是将所有源代码仅复制到映像中。这样,当我创建容器时,我可以轻松地为Maven依赖关系创建卷以避免重新下载:-
1 2 3 4 5 6 7 8 9 10 11 12 | FROM indiver/tournament-base RUN apt-get update && \\ apt-get install -y \\ -o APT::Install-Recommend=false -o APT::Install-Suggests=false \\ maven WORKDIR /usr/local COPY . /spring-tournament-portal/ WORKDIR /spring-tournament-portal COPY ./docker/dev/entrypoint.sh /usr/local/bin/entrypoint.sh ENTRYPOINT ["sh","/usr/local/bin/entrypoint.sh"] RUN ["chmod","+x","/usr/local/bin/entrypoint.sh"] |
这是entrypoint.sh文件
1 2 3 | #!/bin/bash echo"$@" Phase is executing..... mvn clean"$@" |
当我在docker-compose.xml的帮助下构建docker文件后运行映像时。我为依赖文件夹设置了音量。
这是docker compose.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | version:"2" services: test-service: build: context: ../../ dockerfile: ./docker/dev/Dockerfile container_name:"test-service" command: 'test' volumes: - .m2:/root/.m2 build-service: build: context: ../../ dockerfile: ./docker/dev/Dockerfile container_name:"build-service" command: 'package' env_file: - ./EnvironmentConstant.env volumes: - .m2:/root/.m2 database-service: container_name:"database-service" env_file: - ./EnvironmentConstant.env image: mysql ports: -"3306:3306" volumes: - ./dev-mysql:/var/lib/mysql networks: - app-network networks: app-network: driver: bridge |
因此不需要再次重新下载.m2卷中的依赖项。
之后,我需要创建具有由maven准备的构建内容的发行映像。但是构建服务的容器已经停止。所以我需要使用docker cp命令来获取准备好的版本。
1 | docker cp build-service:/spring-tournament-portal/target/spring-tournament-portal-0.0.1-SNAPSHOT D:/Application_Build |
现在我希望将Application_Build文件夹中的版本复制到我的发布映像中。
所以我发布的docker文件看起来像
1 2 3 4 5 6 7 8 9 | FROM indiver/tournament-release ENV APP_PATH=d:/Application_Build ENV ARTIFACT=spring-tournament-portal ENV VERSION=0.0.1-SNAPSHOT ADD ${APP_PATH}/${ARTIFACT}-${VERSION} /opt/tomcat/webapps/${ARTIFACT}-${VERSION} WORKDIR /opt/tomcat/bin ENTRYPOINT ["catalina.sh","jpda","run"] EXPOSE ${PORT} |
但是正如我上面提到的,它给了我错误
1 | Step 5/8 : ADD ${APP_PATH}/${ARTIFACT}-${VERSION} /opt/tomcat/webapps/${ARTIFACT}-${VERSION} ADD failed: stat /var/lib/docker/tmp/docker-builder990684261/d:/Application_Build/spring-tournament-portal-0.0.1-SNAPSHOT: no such file or directory. |
我试图通过COPY和ADD命令进行复制。但是没有任何效果。我怎样才能做到这一点。
如果可以借助其他相对容易的流程来实现。也会有帮助。
所以我也面临着类似的问题。
您可以尝试使用下面列出的命令,并用路径替换方括号:
" docker cp / [您的源目录] [ContainerId]:/ [目标路径]"
总体而言,您的方法对我来说似乎太复杂了,这是一种非常非微服务的处理方式。
我建议您将依赖项复制到正在创建的二进制文件中,以创建一个自包含的胖(超级)jar,您可以将其复制到docker映像中,就像spring boot那样。
您为不同的环境使用单独的docker文件的方法也是有问题的,并且可能导致生产中出现意外情况。
Dockerfile参考说明:
ADD obeys the following rules:
The path must be inside the context of the build.
...