Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自动构建docker容器(java后端、角度前端)_Docker_Maven_Intellij Idea_Dockerfile - Fatal编程技术网

自动构建docker容器(java后端、角度前端)

自动构建docker容器(java后端、角度前端),docker,maven,intellij-idea,dockerfile,Docker,Maven,Intellij Idea,Dockerfile,我想说,这是我的第一个容器,实际上是我的第一个JAVA应用程序,所以我可能会有一些基本的问题,所以请宽容一些 我编写了SpringBoot应用程序,我的同事用angular编写了它的前端部分。我想实现的是在IntelliJ中使用“一个按钮/一个命令”来创建一个包含整个应用程序后端和前端的容器 我需要做的是: 从公司存储库克隆FE(我现在正在使用ssh密钥) 从GitHub克隆 建造FE 将生成的FE复制到java应用程序中的静态文件夹 建造 创建运行此应用程序的容器 我当前的解决方案是创建“构建

我想说,这是我的第一个容器,实际上是我的第一个JAVA应用程序,所以我可能会有一些基本的问题,所以请宽容一些

我编写了SpringBoot应用程序,我的同事用angular编写了它的前端部分。我想实现的是在IntelliJ中使用“一个按钮/一个命令”来创建一个包含整个应用程序后端和前端的容器

我需要做的是:

  • 从公司存储库克隆FE(我现在正在使用ssh密钥)
  • 从GitHub克隆
  • 建造FE
  • 将生成的FE复制到java应用程序中的静态文件夹
  • 建造
  • 创建运行此应用程序的容器
  • 我当前的解决方案是创建“构建器”容器,然后构建FE和BE,然后将其复制到“生产”容器,如下所示:

    #BUILDER
    FROM alpine AS builder
    
    WORKDIR /src
    
    # add credentials on build
    ARG SSH_PRIVATE_KEY
    RUN mkdir /root/.ssh/ \
    && echo "${SSH_PRIVATE_KEY}" > /root/.ssh/id_rsa \
    && echo "github.com,140.82.121.3 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" >> /root/.ssh/known_hosts \
    && chmod 600 /root/.ssh/id_rsa
    
    
    # installing dependencies
    RUN apk update && apk upgrade && apk add --update nodejs nodejs-npm \
    && npm install -g @angular/cli \
    && apk add openjdk11 \
    && apk add maven \
    && apk add --no-cache openssh \
    && apk add --no-cache git
    
    #cloning repositories
    RUN git clone git@code.siemens.com:apcprague/edge/metal-forming-fe.git
    RUN git clone git@github.com:bzumik1/metalForming.git
    
    # builds front end
    WORKDIR /src/metal-forming-fe
    RUN npm install && ng build
    
    # builds whole java app with front end
    WORKDIR /src/metalForming
    RUN cp -a /src/metal-forming-fe/dist/metal-forming/. /src/metalForming/src/main/resources/static \
    && mvn install -DskipTests=true
    
    
    
    
    
    #PRODUCTION CONTAINER
    FROM adoptopenjdk/openjdk11:debian-slim
    LABEL maintainer jakub.znamenacek@siemens.com
    RUN mkdir app
    RUN ["chmod", "+rwx", "/app"]
    WORKDIR /app
    COPY --from=builder /src/metalForming/target/metal_forming-0.0.1-SNAPSHOT.jar .
    EXPOSE 4200
    RUN java -version
    CMD java -jar metal_forming-0.0.1-SNAPSHOT.jar
    
    这是可行的,但我需要很长时间,所以我想这不是正确的方法。谁能给我指出正确的方向吗?我在想,是否有办法让maven完成所有这些步骤,但这可能已经完全失败了。

    另外,如果您在我的Dockerfile中发现任何问题,请告诉我,因为我说过这是我的第一个Dockerfile,所以我可以忽略一些事情

    编辑:

    顺便问一下,有人知道我如何摆脱这个部分:
    echo“github.com,140.82.121.3 ssh rsa2.一个2岁的研究发现了一个2岁的研究发现了一个2岁的研究发现一个2岁的一个2岁的一个2岁的一个2岁的一个2岁的2岁的一个2岁的2岁的2岁的研究发现一个2岁的一个2岁的2岁的2岁的一个2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2岁的2 7+wC604ydGxa8vjis5ap43jxuffaaq==“>>/root/.ssh/known_hosts\
    它将GitHub添加到已知的_主机(我还需要在那里添加一个公司存储库)。这是因为当我运行
    git clone
    时,它会问我是否信任它…我必须写“是”,但如果它在docker中自动运行,我不知道如何做,我没有选择在docker中写“是”。我尝试过
    yes | git clone…
    ,但这也不起作用

    一些事情:

    1,如果它在机器上运行“慢”,那么它在容器中也会运行慢

    2,remove--no cache,*您希望缓存所有静态命令,因为下次生成时,这些命令不会在没有更改的地方运行。一旦一个命令发生更改,该命令将使用生成器缓存重新运行,并且所有后续命令也必须重新运行

    *更新:我把“apk更新--无缓存”和“docker构建--无缓存”弄错了。我说“apk添加--无缓存”是错误的这意味着该命令不会被缓存,因为该命令是在docker builder级别缓存的。但是,使用此参数,您不需要在以后的步骤中删除/var/cache/apk/目录以使图像变小,但您不需要在此处执行此操作,因为您已经在使用多级构建,因此这不会影响最终图像的大小

    还有一件事需要澄清,Dockerfile中的所有语句都会被检查,如果它们没有更改,docker builder会使用缓存层进行检查,并且不会运行该语句。“添加”和“复制”命令是个例外,在这里,生成器还会检查复制的、添加的文件(如果它们使用校验和进行了更改)。此外,如果一条语句被更改或添加了复制文件,则该语句将重新运行,并且所有后续语句也将重新运行,因此您希望尽可能多地将源代码复制语句放在末尾

    如果要禁用此缓存,请执行“docker build--无缓存…”操作,这样将重新运行Dockerfile中的所有步骤

    3、在顶部指定WORKDIR一次,如果以后需要切换目录,请使用以下命令: 运行cd/someotherdir&&mycommand 另外,指定后续WORKDIR将与前一个WORKDIR相对应,因此它将搞乱WORKDIR语句(可能)的唯一目的是什么

    4、启用:

    或者声明环境变量

    DOCKER_BUILDKIT=1 
    
    或者将其添加到/etc/docker/daemon.json

    { "features": { "buildkit": true } }
    
    在这种情况下,BuildKit可能没有帮助,但如果您使用更多的阶段执行更复杂的DockerFile,BuildKit可以并行运行这些文件,因此总体构建速度会更快

    5、不要跳过DskipTests=true的测试:)

    6,如评论中所述,不要在映像构建中克隆repo,您根本不需要这样做。只需将Dockerfile放入repo的/中,并使用Dockerfile命令复制repo文件: 复制
    第一个点是源,即计算机上的当前目录,第二个点是目标,即映像中的工作目录,/src和Dockerfile。您构建图像并将其发布,然后将其推送到docker注册表,以便其他人可以拉取它并开始使用它。如果您想在服务器的帮助下构建和发布更复杂的内容,请查阅CI/CD技术。

    我建议您在Docker之外执行
    git clone
    步骤;它避免了将ssh密钥泄漏到映像中的可能性,并允许您更轻松地构建备用分支或未提交的代码。您还可以为前端和后端应用程序使用单独的构建阶段。不过,我不确定社区能否回答“它太慢了”这一问题;你知道哪一部分速度慢吗?嗨,大卫,我正在容器内使用git克隆,因为我希望有“一次单击/一次命令”的可能性来创建docker映像。如果有更好的方法,我会这样做(我希望我可以告诉maven,在构建之前,它应该克隆FE,构建FE并将其移动到静态文件夹,然后构建BE,然后从构建的应用程序中创建docker映像。我想缓慢的部分是它必须下载FE和BE的所有依赖项。(只有docker构建速度慢,容器本身速度快)@JakubZnamená