在 github actions yml 文件中创建 Minio(S3) 容器

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

我正在尝试创建一个 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"] ...

我尝试使用

-v
标志在
--entrypoint
标志之前挂载卷。

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 server
:(

docker yaml containers github-actions minio
3个回答
8
投票

TL;博士;

存在一个正在进行的 GitHub Actions 社区线程,涉及缺乏对设置

jobs.<job_id>.services.<service_id>.command
的支持以及 这个现有问题与您的非常相似


您可以按照 @ahasbini 的建议扩展官方镜像,然后构建并推送您的

docker image
Docker 注册表,并在
GitHub Actions
image
 中使用您自己的 
jobs.<job_id>.services.<service_id>.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}}
    ),因此我们需要在
    --health-cmd
    中设置
    jobs.<job_id>.services.<service_id>.options
    以命中服务
    livenessProbe
    端点
    在我们开始运行之前确保服务正在运行
    jobs.<job_id>.steps
  2. 我在按名称连接到服务时遇到一些问题,因此我将
    minio
    端点设置为
    locahost:9000
    ,GitHub Actions 在 Kubernetes
    Pod
    中运行,它们共享相同的网络命名空间并且可访问通过
    localhost
  3. 访问jobs.<job_id>.services.<service_id>.env
    jobs.<job_id>.steps.<step_id>.run
    中的
    加密秘密
  4. 使用
    minio context
    github
     将本地目录安装为支持 
    workspace
  5. 服务的卷

GitHub Actions minio service


4
投票

我不推荐这个解决方案,但想把它留在那里,以防其他人用头撞砖墙并想要一个快速但复杂的解决方案。


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

    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服务。

可惜,没有简单的方法可以通过环境变量设置默认存储桶。相反,我们必须通过 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,
        ],
    ],
];

您的客户可能会有所不同。


3
投票

错误是抱怨

--entrypoint "minio server /data"
,而不是
volumes
配置。它似乎正在寻找一个名为
minio server /data
的文件,而不是在 shell 中执行命令。这是关于 --entrypoint 标志如何工作的
很好的解释
,原因是因为
--entrypoint
需要一个文件(二进制文件或脚本)来执行,而不是带有参数的命令来运行。正如here所见,这似乎很难克服。

我想到的唯一建议是在

minio/minio
Docker 镜像之上构建,并在
Dockerfile
中设置参数,并将其上传到 DockerHub,以便您可以将其用作
image

以下是您可以使用的示例

Dockerfile

FROM minio/minio
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh", "minio", "server", "/data"]
© www.soinside.com 2019 - 2024. All rights reserved.