新手求助:如何在GitHub Action的Docker容器内执行命令?
解决GitHub Actions中在Unity Docker容器内执行命令的问题
我来帮你搞定这个问题!你在CircleCI里的配置思路是对的——用Unity的Docker镜像作为执行环境,所有命令都跑在容器里。但GitHub Actions的语法和CircleCI有点不一样,你之前的两种尝试没踩对路子,我给你拆解正确的实现方式:
方法一:让整个Job运行在Unity Docker容器中(最接近CircleCI的写法)
这种方式和你CircleCI里用executors的逻辑完全一致,整个Job的所有步骤都会在指定的Unity Docker容器内执行,不用每次手动处理容器调用:
name: Unity Build CI on: [push] jobs: build-test: # 指定整个Job使用Unity的Docker镜像作为运行环境 container: image: gableroux/unity3d:2018.2.21f1 steps: - name: 拉取项目代码 uses: actions/checkout@v4 - name: 安装zip工具 run: apt-get update && apt-get install zip -y - name: 解密Unity许可证文件 run: openssl aes-256-cbc -d -in .circleci/Unity_v2018.x.ulf.enc -k "${{ secrets.UNITY_LICENSE_DECRYPT_KEY }}" >> .circleci/Unity_v2018.x.ulf - name: 激活Unity许可证 run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -manualLicenseFile .circleci/Unity_v2018.x.ulf || exit 0 - name: 构建Windows 64位版本 run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -noUpm -logFile -projectPath . -buildWindows64Player ./bin-win64/CISample.exe - name: 构建OSX通用版本 run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -noUpm -logFile -projectPath . -buildOSXUniversalPlayer ./bin-osx/CISample.app - name: 打包构建产物 run: | zip -r CISampleWin64Binary.zip ./bin-win64 zip -r CISampleOSXBinary.zip ./bin-osx - name: 上传Windows构建产物 uses: actions/upload-artifact@v4 with: name: Windows-Build path: ./CISampleWin64Binary.zip - name: 上传OSX构建产物 uses: actions/upload-artifact@v4 with: name: OSX-Build path: ./CISampleOSXBinary.zip
关键说明:
- 用
container字段指定Job的运行镜像,所有后续run步骤都会在这个容器内执行 - CircleCI的
store_artifacts对应GitHub Actions的actions/upload-artifact动作 - 环境变量
${UNITY_LICENSE_DECRYPT_KEY}要换成GitHub Secrets的写法${{ secrets.UNITY_LICENSE_DECRYPT_KEY }},记得先在仓库Settings -> Secrets and Variables -> Actions里添加这个密钥
方法二:在单个Step中调用Docker容器执行命令
如果你不想整个Job都跑在容器里,只想特定步骤用Unity镜像,可以手动挂载工作目录到容器中:
name: Unity Build CI on: [push] jobs: build-test: runs-on: ubuntu-latest steps: - name: 拉取项目代码 uses: actions/checkout@v4 - name: 在Unity容器内执行所有构建命令 run: | docker run -v ${{ github.workspace }}:/workspace -w /workspace gableroux/unity3d:2018.2.21f1 bash -c " apt-get update && apt-get install zip -y && openssl aes-256-cbc -d -in .circleci/Unity_v2018.x.ulf.enc -k \"${{ secrets.UNITY_LICENSE_DECRYPT_KEY }}\" >> .circleci/Unity_v2018.x.ulf && /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -manualLicenseFile .circleci/Unity_v2018.x.ulf || exit 0 && /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -noUpm -logFile -projectPath . -buildWindows64Player ./bin-win64/CISample.exe && /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -noUpm -logFile -projectPath . -buildOSXUniversalPlayer ./bin-osx/CISample.app && zip -r CISampleWin64Binary.zip ./bin-win64 && zip -r CISampleOSXBinary.zip ./bin-osx " - name: 上传构建产物 uses: actions/upload-artifact@v4 with: name: Builds path: | ./CISampleWin64Binary.zip ./CISampleOSXBinary.zip
关键说明:
-v ${{ github.workspace }}:/workspace:把GitHub Actions的工作目录挂载到容器的/workspace,这样容器能访问到你的项目代码-w /workspace:设置容器的工作目录为挂载的路径bash -c "...":把所有要执行的命令串起来,让容器一次性执行
你之前尝试失败的原因
第一种尝试
docker run gableroux/unity3d:2018.2.21f1 bash ls:- 没有挂载工作目录,容器里完全看不到你的项目代码
- 命令写法错误,应该是
bash -c "ls",不然bash会把ls当成参数而非要执行的命令
第二种尝试
uses: docker://gableroux/unity3d:2018.2.21f1:- 这个语法只是拉取Docker镜像作为某个Action的运行环境,但后续的
run: ls还是会在主机的Ubuntu环境中执行,不会自动切换到容器里
- 这个语法只是拉取Docker镜像作为某个Action的运行环境,但后续的
内容的提问来源于stack exchange,提问作者Matt Thompson
相关产品推荐
相关产品推荐

