在我的Dockerfiles中,我想复制一个文件到我的镜像中,如果它存在的话,pip的requirements.txt文件似乎是一个很好的候选者,但如何实现呢?
COPY (requirements.txt if test -e requirements.txt; fi) /destination
...
RUN if test -e requirements.txt; then pip install -r requirements.txt; fi
或
if test -e requirements.txt; then
COPY requiements.txt /destination;
fi
RUN if test -e requirements.txt; then pip install -r requirements.txt; fi
9条答案
按热度按时间xjreopfe1#
下面是一个简单的解决方法:
确保
foo
存在,因为COPY
至少需要一个有效的源。如果存在
file-which-may-exist
,则也将复制它。注意:你应该小心确保你的通配符不会选择你不想复制的其他文件。为了更小心,你可以使用
file-which-may-exist?
代替(?
只匹配一个字符)。或者更好的是,使用这样的字符类来确保只能匹配一个文件:
0tdrvxhp2#
正如这条评论所述,Santhosh希雷凯鲁尔的答案仍然是复制文件,要实现真正的条件复制,可以使用此方法。
ONBUILD
指令确保只有在BUILD_ENV
选择了“分支”时才复制文件。kyvafyod3#
2021+,从this answer开始,使用glob pattern,如果找不到任何有效源,Docker COPY不会失败
2015年:目前还不支持(因为我怀疑这会导致不可复制的镜像,因为相同的Dockerfile会复制或不复制文件,这取决于它的存在)。
在issue 13045中,仍然需要使用通配符:《
COPY foo/* bar/" not work if no file in foo
》(2015年5月)。它现在(2015年7月)不会在Docker中实现,但另一个构建工具,如**bocker**可以支持它。
二零二一年:
COPY source/. /source/
为我工作(即复制目录时,空或不,如在“Copy directory into docker build no matter if empty or not - fails on "COPY failed: no source files were specified
"“)2022
以下是我的建议:
它围绕着:
但是如果没有找到
*.jar
,则不复制*.jar
,并且不抛出错误。eivnm1vs4#
我想我想出了一个有效的解决方法来处理这个
Dockerfile
always_exist_on_host.txt
文件将始终被复制到镜像中,并且当sometimes_exist_on_host.txt
文件不存在时,构建不会复制失败。此外,当sometimes_exist_on_host.txt
文件存在时,它将复制。例如:
构建成功
构建仍然成功
jk9hmnmh5#
解决方案
我需要基于ENV变量将FOLDER复制到服务器。我取了空的服务器镜像。在本地文件夹中创建了所需的部署文件夹结构。然后在下面添加了一行到DockerFile将文件夹复制到容器。我在最后一行添加了入口点,file.sh在docker启动服务器之前执行init www.example.com。
然后使用如下脚本在本地创建custom-init.sh文件
在docker-compose文件中,下面几行。
环境:- BUILD_EVN=测试
这些更改在Docker构建期间将文件夹复制到容器。当我们执行docker-compose up时,它会在服务器启动之前将实际需要的文件夹复制或部署到服务器。
w1jd8yoj6#
复制所有文件到一个一次性目录,手工选择你想要的,丢弃其余的。
您可以使用构建阶段来实现类似的功能,这依赖于相同的解决方案,使用
cp
进行有条件复制。通过使用构建阶段,您的最终图像将不包括初始COPY
的所有内容。qlvxas9a7#
尝试了其他的想法,但都没有达到我们的要求。这个想法是为子静态Web应用程序创建基本的nginx镜像。出于安全,优化和标准化的原因,基本映像必须能够在子映像添加的目录上执行
RUN
命令。2基本映像不控制子映像添加哪些目录。假设子映像将COPY
资源放在COMMON_DEST_ROOT
下的某个位置。这种方法是一个黑客,但想法是基本图像将支持
COPY
指令为1到N目录添加的子图像。ARG PLACEHOLDER_FILE
和ENV UNPROVIDED_DEST
用于满足<src>
和<dest>
要求的任何COPY
指令不需要。这种解决方案有明显的缺点,如虚拟
PLACEHOLDER_FILE
和支持的硬编码的COPY指令数量。也没有办法摆脱在COPY指令中使用的ENV变量。omjgkv6w8#
我有其他的解决方法。这个想法是在构建上下文中接触文件,并在Dockerfile中使用copy语句。如果文件存在,它只会创建一个空文件,docker构建不会失败。如果已经有一个文件,它只会更改时间戳。
对于Dockerfile
krugob8w9#
COPY不再要求至少存在一个源,如果没有匹配,globbing也不会失败,因此您可以
如果
requirements.txt
存在,则会复制它,如果它不存在,则不会失败。