与Docker一起复制但不包含复制


Answers:


377

.dockerignore在docker build上下文目录中创建文件(因此,在这种情况下,很可能是node_modules的父目录),其中只有一行:

**/node_modules

尽管您可能只想:

node_modules

有关dockerignore的信息:https ://docs.docker.com/engine/reference/builder/#dockerignore-file


5
谢谢,所以“复制...” 我猜命令不需要更改
亚历山大·米尔斯

并非完全如此:/config/nginx/ /config/logstash/,我在容器bash中找到了它:ls config/ gunicorn logs logstash nginx
SalahAdDin

3
@SalahAdDin出于与您未编写代码相同的原因ls /config/,您是否尝试将这些路径添加到您的.dockerignore中而不加引导符/
Pablo

8
只是node_modules在子目录中不起作用。
rustyx

5
如果您想要将其复制而不只是在该层中,这并不能真正解决问题……
Wes

33

对于那些无法使用.dockerignore文件的用户(例如,如果您需要在一个COPY中使用该文件,而在另一个中则不需要):

是的,但是您需要多个COPY说明。具体来说,您需要为要排除的文件名中的每个字母提供一个COPY。

COPY [^n]*    # All files that don't start with 'n'
COPY n[^o]*   # All files that start with 'n', but not 'no'
COPY no[^d]*  # All files that start with 'no', but not 'nod'

继续直到您拥有完整的文件名,或者只有您有把握地确定没有其他文件名的前缀为止。


1
这不会很麻烦,因为COPY failed: no source files were specified当没有以“ no”开头的文件而不是“ nod”开头的文件时,您将得到一个。
mheck

1
或者,您可以使用两个不同的子目录(用于不同的复制目标),以便例如在我的nginx设置中,我src/将转到/var/www/conf/nginx.conf转到/etc/nginx/conf.d/default.conf。另外,您可以复制所有内容,并在RUN rm -r conf以后复制(也不要保留源树)。我想听听是否有人有其他建议。
尤瓦尔

1
如果我这样做,将对特定文件类型或文件结尾有什么解决方案?
Lea Reimann

这种方法的唯一缺点是您的文件夹结构变平
Islam Q.

如果只有几个目录要复制(例如仅说“ / app”或“ / src”)。一种简单的方法是分别复制目录(以保持其结构),然后只需要COPY [^node_modules]*复制一个顶层文件即可。
smdufb

9

就我而言,我的Dockerfile包含一个安装步骤,该步骤生成vendor目录(与等效的PHP node_modules)。然后,我COPY将该目录转到最终的应用程序映像。因此,我不能把vendor我的.dockerignore。我的解决方案是在执行之前先删除目录composer install(相当于的PHP npm install)。

FROM composer AS composer
WORKDIR /app
COPY . .
RUN rm -rf vendor \
    && composer install 

FROM richarvey/nginx-php-fpm
WORKDIR /var/www/html
COPY --from=composer /app .

该解决方案有效且不会使最终映像膨胀,但这并不理想,因为vendor在构建过程中主机上的目录已复制到Docker上下文中,这会增加时间。


3
注知道为什么你必须删除composer.lock之前composer install。如果没有锁定文件,则下次构建时可能会安装一组不同的依赖关系(供应商文件夹)。
Lacek

1
@Lacek:你是对的。自发布此书以来,我学得更好。
卡梅隆·哈德森

1
@CameronHudson可能会在人们复制/粘贴此不良做法之前更新您的原始答案。
罗宾·范·巴伦

2

添加.dockerignore对我有用。一个额外的点那些谁试图在Windows上的解决方案Windows会不会让你创建.dockerignore文件(因为它在默认情况下允许创建文件开始没有。)

要以创建此类文件。在Windows上还包括一个结束点,例如:,.dockerignore.然后按Enter键(前提是您已启用文件夹选项中的视图扩展选项)


6
您可以在Windows中以点开头也可以以点结尾来创建文件。
吉姆·佩迪德

0

从当前目录中排除node_modules

node_modules

在任何直接子目录中排除node_modules

*/node_modules

这是官方文档

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.