#1686  Build image step fails with "unknown flag: --push" on Mac OSX
Closed
hzgotb opened 5 months ago

OneDev 是 9.3.2

运行 agent 的环境是 mac mini m2 的裸机。里面已经安装了 docker .

因为 .onedev-buildspec.yml 的构建步骤中有部分是需要 run in container 的,所以 Job Executor 是一个 Remote Docker .

这时候 agent 和 job exector 是不是因为不匹配导致 buildx 报错?

Robin Shen commented 5 months ago

Agent 是以docker方式启动的吗?如果是的话,pull一下用最新的image, docker pull 1dev/agent

hzgotb commented 5 months ago

Agent 是以docker方式启动的吗?如果是的话,pull一下用最新的image, docker pull 1dev/agent

裸机。上面写了 😄

然后 docker 也是最新的。在机子上直接运行docker buildx build --help 是有push指令的。

Robin Shen commented 5 months ago

在你能够运行 docker buildx build --push 的命令行窗口里,直接启动agent,然后运行下 job试试能不能成功。

hzgotb commented 5 months ago

你的意思是通过console的方式启动agent吗

Robin Shen commented 5 months ago

是的,看看是不是不同用户账号环境的原因。

hzgotb commented 5 months ago

不行。我现在agent.sh的run_as_user是macos的用户。试了不行,注释掉也一样有问题。是不是裸机agent也要更新?

Robin Shen commented 5 months ago

那你命令行直接运行 docker buildx build --push -t <some tag> <context directory> 能成功吗?

Robin Shen changed title 5 months ago
Previous Value Current Value
在 macos 上构建镜像提示 unknown flag: --push
Build image step fails with "unknown flag: --push" on Mac OSX
hzgotb commented 5 months ago

可以运行没报错。

Robin Shen commented 5 months ago

我这边可以正常工作,你检查下 executor advanced setting 里 docker 是否指向了其他版本。

hzgotb commented 5 months ago

没有。是默认的。

hzgotb commented 5 months ago

我想问一下 remote docker 的机制。因为我的agent是运行在机子上,不是运行在机子上的docker里。 假设,我在步骤1执行checkout,这时候代码应该是在我的机子上的对吧? 那么步骤2执行shell, run in container,那就是说运行一个容器并且把第一步的代码copy进容器(还是挂载?),然后运行shell。 步骤3是构建镜像并发布,那这里的操作是起一个新容器去执行还是通过agent直接在裸机上执行?

Robin Shen commented 5 months ago

步骤 2 会把代码挂载进容器,步骤 3 直接在裸机上执行。

Robin Shen commented 5 months ago

你创建一个包含这个 Mac agent 的 remote shell executor,然后用这个 executor 执行一个 command step,里面 build image 如下看看能否成功:

docker buildx build --push -t <image tag> <context path> -f <your dockerfile> 
hzgotb commented 5 months ago

我添加了一个 remote shell executor ,然后直接 test ,输入pwd是可以的。但是用 docker buildx build --help 就提示:

/opt/onedev-agent/work/temp/onedev-build264561454212748435/job-commands.sh: line 1: docker: command not found
Failed to run command: sh /opt/onedev-agent/work/temp/onedev-build264561454212748435/job-commands.sh, return code: 127
/opt/onedev-agent/work/temp/onedev-build264561454212748435/job-commands.sh: line 1: docker: command not found
Robin Shen commented 5 months ago

找不到 docker 命令,感觉是环境的问题。你直接在 executor 设置里指定 docker 路径看看。或者以控制台模式启动 agent

hzgotb commented 5 months ago

我执行flutter那些指令也是。现在默认的shell是zsh,但是agent启动起来之后获取的环境变量只有寥寥几个,太干净了。 之前我是在 .bashrc 里 export 出了环境变量,然后改了 agent.sh 里的 files_to_source 来解决 flutter指令。

默认情况下只有这些

PATH=/usr/bin:/bin:/usr/sbin:/sbin

我which了一下docker,是在/usr/local/bin/docker

Robin Shen commented 5 months ago

直接控制台启动 agent (./agent.sh console) 环境变量有没有问题 (可以把 files_to_sources 暂时注释掉)?能不能运行上面的 docker 命令?

hzgotb commented 5 months ago

注释后在shell executor的test会报错没找到命令

Robin Shen commented 5 months ago

连 sh 都找不到?那 command step 的 interpreter 里指定一个其他的 shell,比如 zsh

hzgotb commented 5 months ago

重新捋一下。 我把 files_to_sources 注释掉了。 然后在 shell executor 中执行 flutter -v 是报错的,但是执行 docker buildx build --help 是正常的 如果 files_to source="~/.bashrc" 被设置了 那么flutter -v是正常的,docker 指令是找不到的 默认的配置是files_to_source=,即未被注释且没赋值,这时无论是 flutter -v 还是 docker buildx build --help 都是报错的

以上,在remote docker executor中运行构建镜像并推送的行为,均提示unknown flag: --push

hzgotb commented 5 months ago

找不到 docker 命令,感觉是环境的问题。你直接在 executor 设置里指定 docker 路径看看。或者以控制台模式启动 agent

设置了 Docker Sock Path ,一样不行

Robin Shen commented 5 months ago

设置了 Docker Sock Path ,一样不行

Advanced setting 里的 docker executable path

hzgotb commented 5 months ago

没看到 😅
在哪里的

看文档看到了.。我试试

还是不行。提示

Failed to run command: /usr/local/bin/docker buildx build --push -t <my_repo>/<image_name>:latest ., return code: 125
unknown flag: --push
hzgotb commented 5 months ago

是不是 Build Docker Image 这个操作所处的环境有问题?没有加载到 docker-buildx ?

Robin Shen commented 5 months ago

再确认一下,从控制台以 ./agent.sh console的方式启动 (去除files_to_source,先别管 flutter),然后在 shell executor 里通过 command step 运行 docker buildx build --push -t <my_repo>/<image_name>:latest . 还是不行吗?

控制台启动的话 command step 会继承当前命令窗口的所有环境。

hzgotb commented 5 months ago

按这些条件,刚刚试了一下,正常运行

Robin Shen commented 5 months ago

那这个时候能通过 remote docker executor 运行 build image step 吗?

hzgotb commented 5 months ago

不能 😂 😂

Robin Shen commented 5 months ago

在命令行下运行下面的命令能成功吗?

mkdir test
export DOCKER_CONFIG=$(pwd)/test
docker buildx build --push -t <my_repo>/<image_name>:latest .
hzgotb commented 5 months ago

终端还是说builds里的shell executor?

Robin Shen commented 5 months ago

直接在终端下运行

Robin Shen changed state to 'Closed' 4 months ago
Previous Value Current Value
Open
Closed
Robin Shen commented 4 months ago

无法重现。

hzgotb changed state to 'Open' 4 months ago
Previous Value Current Value
Closed
Open
hzgotb commented 4 months ago

我模拟了一下在整个流程,是正常的。可以远程帮忙看一下吗?

对了。我还安装了oh my zsh。不知道有没有关系

我尝试用 ssh user@ip -t /bin/sh 登陆到机子上 printenv ,发现环境变量和 agent.sh 打印出来的是一样的。

agent.sh 使用 /bin/sh 执行的。

hzgotb commented 4 months ago

修改了 agent 的执行方式为 /bin/bash ,并且在.bashrc中完善了环境变量。shell executor中可以运行。就是docker executor的build image步骤一直提示unknown --push。

Robin Shen commented 4 months ago
mkdir test
export DOCKER_CONFIG=$(pwd)/test
docker buildx build --push -t <my_repo>/<image_name>:latest .

试过这个吗?

hzgotb commented 4 months ago

试过了。是正常的。

Robin Shen commented 4 months ago

升级到 9.4.4 看看行不行

hzgotb commented 4 months ago

升级到 9.4.4 看看行不行

终于解决了。😄 😄

为啥源码现在看不到了 🤣 🤣

加一个观察者?

hzgotb commented 4 months ago

或者拉一个贡献者 😁 😁 java和前端我都可以阅读。做做文档,i18n那些没问题。

Robin Shen commented 4 months ago

OneDev 上的源码因为包含了企业版模块,就不公开了。但是其他部分一直会 push 到 github:

https://github.com/theonedev/onedev

也是可以直接编译运行的。

Robin Shen changed state to 'Closed' 4 months ago
Previous Value Current Value
Open
Closed
hzgotb commented 4 months ago

哦哦。之前看github一直是没有源码的。原来如此。好!!

issue 1 of 1
Type
Question
Priority
Normal
Assignee
Labels
No labels
Issue Votes (0)
Watchers (3)
Reference
onedev/server#1686
Please wait...
Page is in error, reload to recover