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

时间:2018-04-05 16:09:33

标签: java maven docker

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

  

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

情景:

我试图在docker的帮助下进行测试,构建,发布阶段循环。 所以我的Multistage 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命令进行复制。但没有任何工作。我怎样才能做到这一点。

如果可以通过其他相对容易的流程来实现这一点。它也会有所帮助。

3 个答案:

答案 0 :(得分:1)

总体而言,您的方法对我来说似乎过于复杂,而且非常微观的服务方式。

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

您为不同环境设置单独的docker文件的方法也存在问题,可能会导致生产中出现意外情况。

答案 1 :(得分:1)

所以我也遇到了类似的问题。 您可以尝试下面列出的命令,并用您的路径替换方括号:

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

答案 2 :(得分:0)

Dockerfile引用说:

  

ADD遵守以下规则:

     

路径必须位于构建的上下文中   ...