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

So I have used the default docker for testcafe which on docker hub is testcafe/testcafe and I have to run a few testcafe scripts.

However, I need the screenshot that fires on error, to be uploaded to somewhere where I can look at it later after the docker image is done running.

I am using the Imgur program which uses bash so I re-did a few things to make it sh compatible and everything works except I need curl. I tried running

apk add curl

but I'm getting the error

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

Now I no this means that I do not have permission to do this but can I get around this is there some way to become root (this is in bitbucket pipeline).

I do NOT really want to create my own docker.

Also note all questions I have found relating to this are about installing while creating the docker, however, my question is how to do this after the docker is created. thx (a fine answer would be another way to save the screen shot, but preferably not with ssh).

92538 次浏览

For those seeing this error using a Dockerfile (and coming here via a Google search): add the following line to your Dockerfile:

USER root

The best fix is to place USER <youruser> AFTER the lines where your docker build is failing. In most cases it is safe to add the USER line directly above the command or entrypoint.

For example:

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"]

For those seeing this error when running through a Jenkins pipeline script (and coming hre via a Google search), use the following when starting your Docker image:

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

Hopefully this will help anyone who is not interested in creating a new container.

If you are trying to enter into your docker container like so:

docker exec -it <containername> /bin/sh

Instead, try this:

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

docker exec -it --user=root {containername} bash

with this I can able to execute apk-update

I have resolved the same problem executing the "docker build -t" command with root user:

#docker build -t $DOCKER_IMAGE

For a Docker container it is easy:

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

For Kubernetes pods, it is a bit more complicated. If your image is built with a non-root user and also you cannot run pods with a root user inside your cluster, you need to install the packages with this method:

  1. Identify the user which the pod is using
  1. Create a new Dockerfile
  1. Configure it as such
FROM pod-image-name:pod-image-tag


USER root


RUN apk update && apk add curl


USER the-original-pod-user
  1. Then build it
docker build -t pod-image-name:pod-image-tag-with-curl .
  1. And change the image of your deployment/pod inside the cluster from pod-image-name:pod-image-tag to pod-image-name:pod-image-tag-with-curl