是否有一个docker构建方法支持从本地到映像的条件复制文件?[duplicate]

pokxtpni  于 2022-11-03  发布在  Docker
关注(0)|答案(2)|浏览(142)

此问题在此处已有答案

Conditional COPY/ADD in Dockerfile?(8个答案)
5天前关闭。
我想建立一个Docker映像。在这个过程中,需要从本地文件系统复制一个大的包(150 MB)到映像。
我想先检查一下这个文件(本地目录)是否存在。如果有,我可以直接把它复制到镜像中。否则我会让docker-build通过一个URL从网上下载它,这会花很多时间。
我称之为条件COPY
但我不知道如何实现这个功能。
RUN if命令无法执行此操作。

pkwftd7m

pkwftd7m1#

例如,您可以在RUN中运行if条件


# !/bin/bash -x

if test -z $1 ; then 
    echo "argument empty"
    ........
else 
    echo "Arg not empty: $1"
    ........
fi

停靠文件:

FROM ...
....
ARG arg
COPY bash.sh /tmp/  
RUN chmod u+x /tmp/bash.sh && /tmp/bash.sh $arg

或者你可以试试这个

FROM centos:7
ARG arg
RUN if [ "x$arg" = "x" ] ; then echo Argument not provided ; else echo Argument is $arg ; fi

对于Copy,您可以发现此dockerfile很有帮助


######### 

# BUILD #

######### 

ARG BASE_IMAGE
FROM maven:3.6.3-jdk-11 AS BUILD
RUN mkdir /opt/trunk
RUN mkdir /opt/tmp
WORKDIR /opt/trunk
RUN --mount=target=/root/.m2,type=cache
RUN --mount=source=.,target=/opt/trunk,type=bind,rw mvn clean package && cp -r /opt/trunk/out/app.ear /opt/tmp

################## 

# Dependencies #

################## 

FROM $BASE_IMAGE
ARG IMAGE_TYPE
ENV DEPLOYMENT_LOCATION /opt/wildfly/standalone/deployments/app.ear
ENV TMP_LOCATION /opt/tmp/app.ear

ARG BASE_IMAGE

COPY if [ "$BASE_IMAGE" = "external" ] ; then COPY --from=BUILD $TMP_LOCATION/*.properties $DEPLOYMENT_LOCATION \
               ; COPY --from=BUILD $TMP_LOCATION/*.xml $DEPLOYMENT_LOCATION \
               ; COPY standalone.conf /opt/wildfly/bin ; fi
ijxebb2r

ijxebb2r2#

我个人将依赖于docker的built-in caching来完成这一任务:

FROM alpine

ADD http://www.example.com/link_to_large_file /some/path

第一次构建时会下载文件。之后的每一次构建都会使用图层缓存,只要你不删除之前的图像。你也可以用storage backends外部化构建缓存。
如果你的ADD之前的指令经常改变图像,你也可以使用--link标志ADD来独立存储这个层。参见文档中的ADD --link或更好的COPY --link。

相关问题