如何将文件从其他位置复制到Docker镜像中



我正试图将文件从其他位置(在windows中,从也是共享驱动器的D驱动器)复制到我的映像中。但这给了我错误。

步骤5/8:添加${APP_PATH}/${ARTIFACT}-${VERSION}/opt/tomcat/webapps/${ARTIFACT}-${版本}ADD失败:stat/var/lib/doker/tmp/doker-builder990684261/d:/Application_Build/spring-tournament-portal-0.0.1SNAPSHOT:没有这样的文件或目录

场景:

我正试图在docker的帮助下使测试、构建、发布阶段循环。所以我的多阶段docker文件的第一个版本看起来像这个

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依赖项创建卷,以避免重新下载:-

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文件

#!/bin/bash
echo "$@" Phase is executing.....
mvn  clean "$@"

当我在docker-compose.xml的帮助下构建docker文件后运行映像时,我为依赖文件夹设置了卷。

这里是docker compose.xml

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命令来获得我准备好的构建。

docker cp build-service:/spring-tournament-portal/target/spring-tournament-portal-0.0.1-SNAPSHOT D:/Application_Build

现在,我想将Application_build文件夹中的构建复制到我的发布映像中。所以我的发布docker文件看起来像

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}

但正如我上面提到的,它给了我错误

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命令进行复制。但什么都不起作用。我怎样才能做到这一点。

如果可以在其他相对容易的流程的帮助下实现这一点。这也会很有帮助。

Dockerfile引用说:

ADD遵守以下规则:

路径必须在生成的上下文中
。。。

总的来说,您的方法对我来说似乎太复杂了,而且是一种非常非微服务的做事方式。

我建议您将依赖项复制到正在创建的二进制文件中,以创建一个自包含的fat(uber)jar,您可以像spring-boot那样将其复制到docker映像中。

为不同的环境提供单独的docker文件的方法也是有问题的,并且可能导致生产中出现意外情况。

所以我也面临着类似的问题。您可以尝试下面列出的命令,并将方括号替换为您的路径:

">docker cp/[您的源目录][ContainerId]:/[目标路径]">

最新更新