在Dockerfile中有条件COPY / ADD?

在我的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 

谢谢 :)

目前还不支持(因为我怀疑它会导致不可重现的图像,因为相同的Dockerfile将复制或不复制文件,这取决于它的存在)。

在13045号问题上仍然使用通配符:“ COPY foo/* bar/" not work if no file in foo “(2015年5月)。
现在(2015年7月)Docker中不会实现它,但是像bocker这样的另一个构build工具可以支持这一点。

解决scheme

我有要求复制文件夹基于ENVvariables的服务器。 我拿走了空的服务器映像。 在本地文件夹中创build所需的部署文件夹结构。 然后添加到DockerFile下面的文件夹复制到容器。 在docker启动服务器之前,最后一行添加了入口点来执行init file.sh。

 #below lines added to integrate testing framework RUN mkdir /mnt/conf_folder ADD install /mnt/conf_folder/install ADD install_test /mnt/conf_folder/install_test ADD custom-init.sh /usr/local/bin/custom-init.sh ENTRYPOINT ["/usr/local/bin/custom-init.sh"] 

然后用下面的脚本在本地创buildcustom-init.sh文件

 #!/bin/bash if [ "${BUILD_EVN}" = "TEST" ]; then cp -avr /mnt/conf_folder/install_test/* /mnt/wso2das-3.1.0/ else cp -avr /mnt/conf_folder/install/* /mnt/wso2das-3.1.0/ fi; 

docker-compose文件的下面。

环境: – BUILD_EVN =testing

在Docker构build期间,这些更改将文件夹复制到容器。 当我们执行docker-compose up时 ,在服务器启动之前将实际需要的文件夹复制或部署到服务器。

这是一个简单的解决方法:

 COPY foo file-which-may-exist* /target 

确保foo存在,因为COPY至less需要一个有效的来源。

如果file-which-may-exist ,它也将被复制。

注意:您应该注意确保您的通配符不会选取其他您不打算复制的文件。 要更小心,你可以使用file-which-may-exist? 相反( ?只匹配一个字符)。

或者甚至更好,使用这样的字符类来确保只有一个文件可以匹配:

 COPY foo file-which-may-exis[t] /target 

也许你只是不需要! 让我们再看看你的代码:

 COPY (requirements.txt if test -e requirements.txt; fi) /destination RUN if test -e requirements.txt; then pip install -r requirements.txt; fi 

也许你可以切换到:

 COPY requirements.txt /requirements.txt RUN if test -e /requirements.txt; then pip install -r /requirements.txt; fi 

现在你有这个:

  • 如果文件存在,它将被COPY复制,并在RUN中被PIP处理
  • 如果文件不存在,COPY将会失败(默默地,我想),并且由于条件,PIP将不能运行
Interesting Posts