在Dockerfile中,我有
COPY . .
我想排除整个目录,在我的例子中是node_modules目录。
这样的事情:
COPY [all but **/node_modules/**] .
Docker可以实现吗?
答案 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)
答案 6 :(得分:0)
对于使用gcloud build的用户:
gcloud build
忽略.dockerignore
,而寻找.gcloudignore
使用:
cp .dockerignore .gcloudignore