【问题标题】:Alpine Docker ERROR: Unable to lock database: Permission denied ERROR: Failed to open apk database: Permission deniedAlpine Docker 错误:无法锁定数据库:权限被拒绝错误:无法打开 apk 数据库:权限被拒绝
【发布时间】:2018-11-16 13:48:21
【问题描述】:

所以我使用了 testcafe 的默认 docker,它在 docker hub 上是 testcafe/testcafe,我必须运行一些 testcafe 脚本。

但是,我需要将错误触发的屏幕截图上传到某个地方,以便在 docker 映像运行完成后稍后查看它。

我正在使用使用 bash 的 Imgur 程序,因此我重新做了一些事情以使其与 sh 兼容,并且一切正常,除了我需要 curl。我试着跑了

apk add curl

但我得到了错误

ERROR: Unable to lock database: Permission denied ERROR: Failed to open apk database: 

现在我不,这意味着我无权执行此操作,但我可以解决这个问题吗?是否有某种方法可以成为 root(这是在 bitbucket 管道中)。

我真的不想创建自己的 docker。

还请注意,我发现的所有与此相关的问题都是关于在创建 docker 时进行安装的,但是,我的问题是如何在创建 docker 后执行此操作。 thx(一个很好的答案是另一种保存屏幕截图的方法,但最好不要使用 ssh)。

【问题讨论】:

  • 运行容器时可以加-u="root"命令:docker run -it -u="root" testcafe/testcafe 这就是你要的吗?
  • 感谢@Marion,但在我进入 docker 后我没有启动 docker
  • @Vladimir_314159 你真的应该尝试一下@Marion 的建议,因为在 docker 命令行上指定一个用户将在容器中以该用户的身份运行默认或提供的命令(因此,如果你启动一个 shell,您将以 root 身份以 shell 结尾,这可能是您能够apk add 所需要的)。我遇到了与您描述的完全相同的问题,这就是解决方案。
  • 我可以在 bitbucket 管道上执行此操作吗? @GuillaumeG。
  • @Vladimir_314159 在 Bitbucket Pipelines 中,您可以使用“run-as”标签。 confluence.atlassian.com/bitbucket/… 你希望以 '0' 的身份运行。

标签: docker testing automated-tests alpine testcafe


【解决方案1】:

对于那些使用 Dockerfile(并通过 Google 搜索来到这里)看到此错误的人:将以下行添加到您的 Dockerfile:

USER root

【讨论】:

  • 如果我不想使用root。我应该在这个命令RUN addgroup -S something && adduser -S -G something something 中添加什么以使其运行apk add
  • 不安全,但可以。这是运行 Dockerfile 的代理的权限问题。供参考——我在为 Digital Ocean Jenkins CI 服务器设置 Dockerfile 构建时遇到了这个问题(我需要 APK ADD NodeJS 和 NVM 等)。
  • @kamal 我修复它的方式是我只是在apk添加评论之后使用了RUN addgroup -S something && adduser -S -G something something。不过,可能并不适合所有场景。
  • 这确实解决了这个问题,只需确保在 Dockerfile 末尾运行“USER nobody”即可。
  • 在使用这个容器时有什么后果吗?或者我们需要修改 entrypoiny/cmd 以便始终以root 身份登录?
【解决方案2】:

希望这对那些对创建新容器不感兴趣的人有所帮助。

如果您尝试像这样进入您的 docker 容器:

docker exec -it <containername> /bin/sh

试试这个:

docker exec -it --user=root <containername> /bin/sh

【讨论】:

    【解决方案3】:

    对于那些在通过 Jenkins 流水线脚本运行(并通过 Google 搜索进入)时看到此错误的人,请在启动 Docker 映像时使用以下命令:

    node('docker') {
      docker.image('golang:1.14rc1-alpine3.11').inside(' -u 0') {
        sh 'apk add curl'
        ...
      }
    }
    

    【讨论】:

    • 使用声明式管道时,在定义图像之前在docker { } 中添加args '-u 0'
    • 它正在工作!谢谢。你能解释一下这个 args 到底在做什么吗?
    【解决方案4】:
    docker exec -it --user=root {containername} bash
    

    有了这个我可以执行 apk-update

    【讨论】:

      【解决方案5】:

      最好的解决方法是将USER <youruser> AFTER 放在 docker 构建失败的行。在大多数情况下,直接在命令或入口点上方添加USER 行是安全的。

      例如:

      FROM python:3.8.0-alpine
      
      RUN addgroup -S app && adduser -S -G app app
      
      RUN apk add --no-cache libmaxminddb postgresql-dev gcc musl-dev
      
      ADD . .
      
      USER app
      
      ENTRYPOINT ["scripts/entrypoint.sh"]
      
      CMD ["scripts/gunicorn.sh"]
      

      【讨论】:

        【解决方案6】:

        我已经解决了以 root 用户执行“docker build -t”命令的同样问题:

        #docker build -t $DOCKER_IMAGE

        【讨论】:

          猜你喜欢
          • 2020-09-20
          • 2018-03-27
          • 1970-01-01
          • 1970-01-01
          • 2017-04-17
          • 1970-01-01
          • 2016-09-04
          • 2014-01-02
          • 2020-05-31
          相关资源
          最近更新 更多