我正在尝试创建一个 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
:(
存在一个正在进行的 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
注释:
图像当前没有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
- 我在按名称连接到服务时遇到一些问题,因此我将
端点设置为minio
,GitHub Actions 在 Kuberneteslocahost:9000
中运行,它们共享相同的网络命名空间并且可访问通过Pod
localhost
- 访问
jobs.<job_id>.services.<service_id>.env
和jobs.<job_id>.steps.<step_id>.run
中的加密秘密- 使用
服务的卷minio
context的github
将本地目录安装为支持workspace
我不推荐这个解决方案,但想把它留在那里,以防其他人用头撞砖墙并想要一个快速但复杂的解决方案。
在我们的工作流程中我们添加了:
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
创建存储桶。
一些问题:
endpoint
而不是 url
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,
],
],
];
您的客户可能会有所不同。
错误是抱怨
--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"]