首页 > 解决方案 > dockerignore 即使写得正确也不起作用

问题描述

我的 .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上的指南,为什么会发生这种情况?某些文件有例外吗?

标签: dockergitlab-ci

解决方案


不,除了以 . 开头的行外,没有例外!.dockerignore我的猜测是构建上下文的路径和根目录之间存在一些错误。要在这种情况下工作,所有内容都必须位于同一目录中。您可以通过添加额外的通配符来排除故障*,例如 ( */*/CHANGELOG)。

但是,将需要包含在构建上下文中的所有内容放在专用文件夹(例如docker子目录)中可能会更简单、更安全。使用此设置,您不需要.dockerignore(除了忽略Dockerfile例如),并且您将避免无意中在图像中复制文件(在项目生命周期中添加且未正确忽略)。后果可能是更大的图像尺寸、不必要的重建、秘密曝光等。


推荐阅读