我的 .dockerignore 文件
.gitlab-ci.yml
CHANGELOG
VERSION
README.md
我的 Dockerfile
FROM php:7.4-apache
#COPY SOURCE CODE
COPY . /var/www/html/
#INSTALL MYSQL EXTENSION
RUN docker-php-ext-install mysqli
我的 .gitlab-ci.yml 处于构建阶段
build image:
stage: build
rules:
- if: $CI_COMMIT_TAG
- if: $CI_OPEN_MERGE_REQUESTS
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: never
- if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
image: docker:latest
services:
- docker:dind
dependencies:
- generate tag
before_script:
- docker login -u "$DOCKER_USER" -p "$DOCKER_PASSWORD"
script:
- docker build --compress -t "$DOCKER_USER"/"$DOCKER_IMAGE_NAME":"$TAG" .
- docker push "$DOCKER_USER"/"$DOCKER_IMAGE_NAME":"$TAG"
我的文件检查结果
$ ls
CHANGELOG
Dockerfile
README.md
VERSION
application
index.php
system
testci.sql
vendor
即使我遵循了 https://docs.docker.com/engine/reference/builder/#dockerignore-file 上的指南,为什么还会发生这种情况?某些文件有例外吗?
不,除了以
!
开头的行之外,没有任何例外。
我的猜测是 .dockerignore
的路径和构建上下文的根之间存在一些错误。要在这种情况下工作,所有内容都必须位于同一目录中。您可以通过添加额外的通配符 *
来排除故障,例如 (*/*/CHANGELOG
)。
但是,将需要包含在构建上下文中的所有内容放在专用文件夹中(例如
docker
子目录)可能会更简单、更安全。通过此设置,您不需要 .dockerignore
(例如,除了忽略 Dockerfile
),并且您将避免在图像中无意中复制文件(在项目生命周期中添加且未正确忽略)。后果可能是更大的图像尺寸、不必要的重建、秘密暴露等。
我在尝试将
.dockerignore
应用于已安装的卷时偶然发现了这个问题。根据我的理解,这是错误的,因为 afaik .dockerignore
是在构建时读取的,但安装是在运行时发生的。
在这种情况下,匿名卷是一个非常好的工作解决方案,请参阅this帖子。