Alpine Docker ОШИБКА: невозможно заблокировать базу данных: в доступе отказано ОШИБКА: не удалось открыть базу данных apk: в разрешении отказано

Поэтому я использовал докер по умолчанию для testcafe, который на концентраторе докеров - testcafe / testcafe, и мне нужно запустить несколько скриптов testcafe.

Однако мне нужен снимок экрана, который запускается при ошибке, чтобы его можно было загрузить куда-нибудь, где я смогу посмотреть его позже, после того, как образ докера будет запущен.

Я использую программу Imgur, которая использует bash, поэтому я переделал несколько вещей, чтобы сделать ее совместимой с sh, и все работает, за исключением того, что мне нужен curl. Я пробовал бежать

apk add curl

но я получаю сообщение об ошибке

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

Нет, это означает, что у меня нет разрешения на это, но могу ли я обойти это, есть ли способ стать пользователем root (это в конвейере битбакета).

Я НЕ очень хочу создавать свой собственный докер.

Также обратите внимание, что все вопросы, которые я нашел по этому поводу, касаются установки при создании докера, однако мой вопрос в том, как это сделать после создания докера. спасибо (хороший ответ - еще один способ сохранить снимок экрана, но желательно не с помощью ssh).


person Vladimir_314159    schedule 06.06.2018    source источник
comment
Вы можете добавить команду -u = root при запуске контейнера: docker run -it -u = root testcafe / testcafe Это то, что вам нужно?   -  person Marion    schedule 07.06.2018
comment
спасибо @Marion, но я спрашиваю о том, что после того, как я нахожусь в докере, не запускаю докер   -  person Vladimir_314159    schedule 07.06.2018
comment
@ Vladimir_314159 Вам действительно стоит попробовать предложение @ Marion, потому что указание пользователя в командной строке докера запустит команду по умолчанию или предоставленную команду в качестве этого пользователя в контейнере (следовательно, если вы запустите оболочку, вы закончите оболочку как root, который вам, вероятно, понадобится apk add). Я столкнулся с той же проблемой, что и вы описываете, и это было решение.   -  person Guillaume G.    schedule 08.06.2018
comment
я могу сделать это на конвейере битбакета? @GuillaumeG.   -  person Vladimir_314159    schedule 08.06.2018
comment
@ Vladimir_314159 В Bitbucket Pipelines можно использовать тег run-as.   -  person phod    schedule 10.08.2018
comment
Для меня эта проблема была решена путем удаления контейнера и изображения с помощью docker rmi <image>. Сначала он удалил теги, после чего я удалил его и восстановил. После вытягивания он снова заработал и правильно назначил пользователей.   -  person HelloBlob    schedule 08.02.2020
comment
Если контейнер уже запущен, вы также можете указать пользователя для docker exec: docker exec -it -u=root <container-name> bash, а затем выполнить apk add curl   -  person Matthew    schedule 04.11.2020


Ответы (5)


Для тех, кто видит эту ошибку, используя Dockerfile (и приходит сюда через поиск Google): добавьте следующую строку в свой Dockerfile:

USER root
person Penghe Geng    schedule 15.06.2019
comment
Если я не хочу использовать root. Что я должен добавить в эту команду RUN addgroup -S something && adduser -S -G something something, чтобы она работала apk add? - person kamal; 18.09.2019
comment
Небезопасно, но работает. Это была проблема с разрешениями для агента, запускающего Dockerfile. Для справки - я столкнулся с этой настройкой сборки Dockerfile для сервера Digital Ocean Jenkins CI (мне нужно было APK ADD NodeJS и NVM и т. Д.). - person RoboBear; 21.11.2019
comment
@kamal, как я это исправил, я просто использовал RUN addgroup -S something && adduser -S -G something something после добавления комментария apk. Но пробалби подходит не для каждого сценария. - person LOLWTFasdasd asdad; 16.03.2020
comment
Это действительно устранило проблему, просто убедитесь, что в конце вашего Dockerfile запущено «USER nobody». - person Felipe Plazas; 02.10.2020
comment
есть ли у них какие-либо последствия при использовании этого контейнера? или нам нужно изменить entrypoiny / cmd, чтобы всегда входить в систему как root? - person kAmol; 02.06.2021

Надеюсь, это поможет всем, кто не заинтересован в создании нового контейнера.

Если вы пытаетесь войти в свой док-контейнер так:

docker exec -it <containername> /bin/sh

Вместо этого попробуйте следующее:

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

person flyer2403    schedule 05.11.2020

Для тех, кто видит эту ошибку при запуске сценария конвейера Jenkins (и приходит через поиск Google), используйте следующее при запуске образа Docker:

node('docker') {
  docker.image('golang:1.14rc1-alpine3.11').inside(' -u 0') {
    sh 'apk add curl'
    ...
  }
}
person Neil    schedule 20.02.2020
comment
При использовании декларативного конвейера добавьте args '-u 0' внутри docker { } перед определением изображения - person Thomas Göhringer; 14.05.2020
comment
Это работает!! Спасибо. Вы можете объяснить, что именно делает этот аргумент? - person Karthikeyan; 04.03.2021

Лучшее решение - разместить USER <youruser> ПОСЛЕ строк, в которых происходит сбой сборки докеров. В большинстве случаев безопасно добавить строку 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"]
person mmla    schedule 24.11.2019

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

с этим я могу выполнить apk-update

person Phani Chakradhar    schedule 13.01.2021