dockerignore 即使写得正确也不起作用

问题描述 投票:0回答:2

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

docker gitlab-ci
2个回答
1
投票

不,除了以

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

但是,将需要包含在构建上下文中的所有内容放在专用文件夹中(例如

docker
子目录)可能会更简单、更安全。通过此设置,您不需要
.dockerignore
(例如,除了忽略
Dockerfile
),并且您将避免在图像中无意中复制文件(在项目生命周期中添加且未正确忽略)。后果可能是更大的图像尺寸、不必要的重建、秘密暴露等。


0
投票

我在尝试将

.dockerignore
应用于已安装的卷时偶然发现了这个问题。根据我的理解,这是错误的,因为 afaik
.dockerignore
是在构建时读取的,但安装是在运行时发生的。

在这种情况下,匿名卷是一个非常好的工作解决方案,请参阅this帖子。

© www.soinside.com 2019 - 2024. All rights reserved.