在 Github Actions 的 yml 文件中创建一个 Minio(S3) 容器

5

我想创建一个Minio/S3容器,以便在Github上将我的测试套件作为操作运行。目前我有以下内容:

name: Run Tests
on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-18.04

    services:
      postgres:
        ...

      minio:
        image: minio/minio
        volumes:
          - /data
        ports:
          - 9000:9000
        env:
          MINIO_ACCESS_KEY: minio
          MINIO_SECRET_KEY: minio123
        options: --entrypoint "minio server /data" --health-cmd "curl -f http://localhost:9000/minio/health/live" --health-interval 10s --health-timeout 5s --health-retries 5

    steps:
      ...

我已尝试以下排列组合来使minio容器正常运行,但未成功:
volumes:
  - ./data:/data

volumes:
  - ./:/data

volumes:
  - .:/data

volumes:
  - /data:/data

我甚至尝试了:

options: --entrypoint "mkdir /data; minio server /data" ...

options: --entrypoint "minio server /tmp" ...

options: --entrypoint ["minio server", "/tmp"] ...

我之前尝试过在使用--entrypoint标志之前,使用-v标志来挂载卷。

options: -v /s3_data:/data --entrypoint "minio server /data" ...

options: -v ${{ github.workspace }}/s3_data:/data --entrypoint "minio server /data" ...

options: -v ${{ github.workspace }}/s3_data:/data:rw --entrypoint "minio server /data" ...

为了让它工作,但不幸的是我遇到了问题:
starting container process caused: exec: "minio server /data": stat minio server /data: no such file or directory: unknown

我无法在没有任何参数的情况下运行minio服务器 :(


需要在容器内挂载什么?是来自GitHub存储库的目录吗? - Attila Viniczai
3个回答

7

简述;

有一个正在进行中的GitHub Actions社区主题,涉及缺乏支持设置jobs.<job_id>.services.<service_id>.command这个现有的问题与你的非常相似


您可以像@ahasbini建议的那样,扩展官方镜像(You could extend the official image),然后构建并推送docker imageDocker Registry,并在GitHub Actionsjobs.<job_id>.services.<service_id>.image中使用自己的image。例如: Dockerfile文件:
FROM minio/minio
CMD ["server", "/data", "--address=0.0.0.0:9000"]

注意: 你可以使用我为此答案构建的lazybit/minio镜像。

job.<job_id>.services.<service_id>规范:

jobs:
  ...
  minio:
    name: minio
    runs-on: ubuntu-latest
    services:
      minio:
        image: lazybit/minio
        ports:
          - 9000:9000
        env:
          MINIO_ACCESS_KEY: ${{ secrets.MINIO_ACCESS_KEY }}
          MINIO_SECRET_KEY: ${{ secrets.MINIO_SECRET_KEY }}
        volumes:
          - ${{ github.workspace }}/data:/data
        options: --name=minio --health-cmd "curl http://localhost:9000/minio/health/live"
    steps:
      - run: pip3 install minio
      - run: |
            python3 - <<'EOF'
            from minio import Minio
            from minio.error import ResponseError

            try:
                minio = Minio(
                    'localhost:9000',
                    access_key='${{ secrets.MINIO_ACCESS_KEY }}',
                    secret_key='${{ secrets.MINIO_SECRET_KEY }}',
                    secure=False
                )
            except Exception as ex:
                raise

            minio.make_bucket('foo')
            minio.make_bucket('bar')
            print(f'{minio.list_buckets()}')
            EOF

注意事项:

  1. minio/minio镜像目前没有设置HEALTHCHECK指令 (docker inspect minio/minio:latest --format {{.Config.Healthcheck}}),因此我们需要在jobs.<job_id>.services.<service_id>.options中设置--health-cmd以访问服务的 livenessProbe 端点,以确保在运行jobs.<job_id>.steps之前该服务正在运行
  2. 我在连接服务时遇到了一些问题,因此我将minio端点设置为locahost:9000,GitHub Actions在一个Kubernetes Pod中运行,它们共享相同的网络命名空间,并可以通过localhost访问
  3. 访问jobs.<job_id>.services.<service_id>.envjobs.<job_id>.steps.<step_id>.run中的加密秘密信息
  4. 使用github上下文workspace将本地目录挂载为支持minio服务的卷

GitHub Actions minio service


2
MinIO发布了一个专门用于此目的的容器minio/minio:edge-cicd - https://hub.docker.com/layers/minio/minio/edge-cicd/images/sha256-29e8e51691d11e779468f275002779b221fd3902518d103e35c8a8bb2ef0f3ea?context=explore - Harshavardhana
1
@Harshavardhana,您能否发布一个使用minio/minio:edge-cicd镜像创建特定存储桶的示例? - k0pernikus
这里有一个完整的工作示例:https://github.com/minio/minio/discussions/16099 - William Desportes
1
GH Actions 社区线程的链接已损坏。我已经在 这里 开始了另一个讨论此问题的线程。该问题涉及将命令传递给服务容器的更广泛问题,不一定是使minio作为服务容器运行的具体细节。 - teuber789

3
该错误提示是关于--entrypoint "minio server /data"而不是关于volumes配置。看起来它正在寻找一个名为minio server /data的文件,而不是在shell中执行该命令。这里有一个很好的解释关于如何使用--entrypoint标志,原因是因为--entrypoint需要执行的是一个文件(二进制文件或脚本),而不是带参数运行的命令。似乎很难克服这个问题,就像在这里看到的那样。
我能想到的唯一建议是在Dockerfile中设置参数并构建在minio/minio Docker镜像上,并将其上传到DockerHub,以便您可以将其用作image
以下是您可以使用的示例Dockerfile:
FROM minio/minio
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh", "minio", "server", "/data"]

1

我不建议使用这种解决方案,但是如果有人正在为问题苦苦挣扎并希望快速但复杂的解决方案,我还是想提供一下。


在我们的工作流程中,我们添加了:

    services:
      minio:
        # fixme: let's not depend on external unofficial image
        image: lazybit/minio
        ports:
          - 9000:9000
        env:
          MINIO_ROOT_USER: accesskey
          MINIO_ROOT_PASSWORD: password
        options: --name=minio --health-cmd "curl http://localhost:9000/minio/health/live"
    steps:
      - run: wget https://dl.min.io/client/mc/release/linux-amd64/mc
      - run: chmod +x ./mc
      - run: ./mc alias set minio http://127.0.0.1:9000 accesskey password
      - run: ./mc mb --ignore-existing minio/MY_BUCKET

我使用了非官方的lazybit/minio镜像,因为官方的无法运行。

基本上,这个 Github Action 创建了一个包含所有其他镜像“合并”的镜像。所以我们知道可以通过http://localhost:9000访问minio服务。不幸的是,没有一种简单的方法可以通过环境变量设置默认存储桶,但我们必须通过mc创建存储桶。


一些需要注意的地方:

  • Minio在其配置中使用endpoint而不是url
  • minio要求将use_path_style_endpoint设置为true

在我们的情况下,我们使用了 Laravel 应用程序,因此我们必须像这样定义文件系统配置:

<?php


$envUsingMinIo = ['local', 'testing-local'];
$usesMinIo = in_array(
    needle: env('APP_ENV'),
    haystack: $envUsingMinIo,
    strict: true
);

return [
    'disks' => [
        ...,
        's3' => [
            'driver' => 's3',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'region' => env('AWS_DEFAULT_REGION', 'eu-west-1'),
            'bucket' => env('AWS_BUCKET'),
            'url' => env('AWS_URL'),
            // the below 'endpoint' url is actually used for minio:
            'endpoint' => env('AWS_URL'),
            // use older urls:
            'use_path_style_endpoint' => $usesMinIo,
        ],
    ],
];


这可能因为您的客户而有所不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接