阿尔卑斯码头工人错误:无法锁定数据库:权限被拒绝错误:无法打开apk数据库:权限被拒绝



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

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

我正在使用使用 bash 的 Imgur 程序,所以我重新做了一些事情来使其兼容 sh,除了我需要卷曲之外,一切都可以正常工作。 我试过跑步

apk add curl

但我收到错误

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

现在我不,这意味着我没有这样做的权限,但是我可以解决这个问题吗?有没有办法成为root(这是在bitbucket管道中(。

我真的不想创建自己的码头工人。

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

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

USER root

希望这将帮助任何对创建新容器不感兴趣的人。

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

docker exec -it <containername> /bin/sh

相反,请尝试以下操作:

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

最好的解决方法是将UUSER <youruser>放在 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"]
docker exec -it --user=root {containername} bash

有了这个,我可以执行apk更新

对于 Docker 容器来说,这很容易:

docker exec -it --user root container-name sh

对于 Kubernetes pod,它有点复杂。如果您的映像是使用非 root 用户构建的,并且您无法在集群中使用 root 用户运行 pod,则需要使用此方法安装软件包:

  1. 标识容器正在使用的用户
  1. 创建一个新的Dockerfile
  1. 这样配置
FROM pod-image-name:pod-image-tag
USER root
RUN apk update && apk add curl
USER the-original-pod-user
  1. 然后构建它
docker build -t pod-image-name:pod-image-tag-with-curl .
  1. 并将集群内部署/Pod 的映像从 pod-image-name:pod-image-tag 更改为 pod-image-name:pod-image-tag-with-curl

对于那些在运行 Jenkins 管道脚本(并通过 Google 搜索进入(时看到此错误的人,请在启动 Docker 映像时使用以下内容:

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

我已经解决了与 root 用户一起执行"docker build -t"命令的相同问题:

#docker build -t $DOCKER_IMAGE

apk 更新 https 权限被拒绝,但使用 http 时请求有效:

RUN sed -i 's/https/http/g' /etc/apk/repositories
RUN apk update

最新更新