COPY与docker但排除在外

时间:2017-05-02 21:48:02

标签: docker dockerfile docker-copy

在Dockerfile中,我有

COPY . .

我想排除整个目录,在我的例子中是node_modules目录。

这样的事情:

   COPY [all but **/node_modules/**] .

Docker可以实现吗?

7 个答案:

答案 0 :(得分:198)

在docker build context目录中创建文件.dockerignore(所以在这种情况下,很可能是node_modules的父目录),其中包含一行:

**/node_modules

虽然你可能只想要:

node_modules

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

答案 1 :(得分:14)

对于那些无法使用.dockerignore文件的用户(例如,如果您需要在一个COPY中使用该文件,而在另一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'

一直持续到您拥有完整的文件名或您可以肯定地确定没有其他文件的前缀为止。

答案 2 :(得分:3)

一种单一解决方案,在项目根目录的命令提示符终端中键入以下内容。

echo node_modules > .dockerignore

这将创建无扩展名。带前缀的文件没有任何问题。将 node_modules 替换为要排除的文件夹。

答案 3 :(得分:2)

添加.dockerignore对我有用。 还有一点是,那些正在Windows上尝试此解决方案的人, windows不会允许您创建.dockerignore文件(因为默认情况下不允许创建以。开头的文件)。

这里提到的技巧:https://www.hanselman.com/blog/HowToCreateAFileWithADotPrefixInWindowsExplorer.aspx

其中也包含一个结束点,例如:.dockerignore.并按Enter键(前提是您已启用文件夹选项中的视图扩展选项)

答案 4 :(得分:1)

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

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

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

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

答案 5 :(得分:1)

从当前目录中排除node_modules

node_modules

不包括任何直接子目录中的node_modules

*/node_modules

这里是official docs

答案 6 :(得分:0)

对于使用gcloud build的用户

gcloud build忽略.dockerignore,而寻找.gcloudignore

使用:

cp .dockerignore .gcloudignore

Source