도커 용기 안에서 스도를 사용하는 방법은?
일반적으로 도커 컨테이너는 사용자 루트를 사용하여 실행됩니다.다른 사용자를 사용하고 싶은데 도커의 USER 지침을 사용하는 데 문제가 없습니다.하지만 이 사용자는 용기 안에서 sudo를 사용할 수 있어야 합니다.이 명령이 없습니다.
이를 위한 간단한 Docker 파일은 다음과 같습니다.
FROM ubuntu:12.04
RUN useradd docker && echo "docker:docker" | chpasswd
RUN mkdir -p /home/docker && chown -R docker:docker /home/docker
USER docker
CMD /bin/bash
이 컨테이너를 실행하면 '도커' 사용자와 로그인합니다.sudo를 사용하려고 하면 명령어가 나오지 않습니다.그래서 저는 도커 파일 안에 sudo 패키지를 설치하려고 했습니다.
RUN apt-get install sudo
이로 인해 패키지 sudo를 찾을 수 없습니다.
알겠습니다.regan이 지적했듯이, 저는 사용자를 sudoers 그룹에 추가해야 했습니다.그러나 주요 이유는 저장소 캐시를 업데이트하는 것을 잊어버려서 apt-get이 sudo 패키지를 찾을 수 없었기 때문입니다.이제 됐어요.완성된 코드는 다음과 같습니다.
FROM ubuntu:12.04
RUN apt-get update && \
apt-get -y install sudo
RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo
USER docker
CMD /bin/bash
sudo 또는 apt-get 둘 다 컨테이너에서 사용할 수 없는 경우 명령을 사용하여 실행 중인 컨테이너에 루트 사용자로 뛰어들 수도 있습니다.
docker exec -u root -t -i container_id /bin/bash
다른 대답들은 저에게 효과가 없었습니다.계속 검색해보니 도커 컨테이너 안에서 팀이 루트를 사용하지 않고 실행하는 방법을 다룬 블로그 게시물을 발견했습니다.
다음은 TL;DR 버전입니다.
RUN apt-get update \
&& apt-get install -y sudo
RUN adduser --disabled-password --gecos '' docker
RUN adduser docker sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER docker
# this is where I was running into problems with the other approaches
RUN sudo apt-get update
사용하고 있었습니다.FROM node:9.3
하지만 다른 유사한 컨테이너 기지도 작동할 것으로 예상됩니다.
이미 실행 중인 컨테이너와 관련하여 이 문제가 발생하고 재구성할 필요가 없는 사용자를 위해 다음 명령은 루트 권한으로 실행 중인 컨테이너에 연결됩니다.
docker exec -ti -u root container_name bash
또한 다음을 사용하여 이름이 아닌 ID를 사용하여 연결할 수 있습니다.
docker ps -l
다음에 컨테이너(또는 도커 합성 클러스터)를 시작할 때 변경 내용이 그대로 유지되도록 변경 내용을 저장하려면 처음부터 다시 작성해도 이러한 변경 내용이 반복되지 않습니다.
docker commit container_id image_name
이전 이미지 버전으로 롤백하려면(경고: 끝에 추가되는 대신 기록이 삭제되므로 현재 이미지에 대한 참조를 유지하려면 옵션 단계를 사용하여 먼저 태그를 지정하십시오.)
docker history image_name
docker tag latest_image_id my_descriptive_tag_name # optional
docker tag desired_history_image_id image_name
실행 중이지 않은 컨테이너를 시작하고 루트로 연결하려면:
docker run -ti -u root --entrypoint=/bin/bash image_id_or_name -s
실행 중인 컨테이너에서 복사하기
docker cp <containerId>:/file/path/within/container /host/path/target
이미지의 복사본을 내보내는 방법
docker save container | gzip > /dir/file.tar.gz
다음을 사용하여 다른 도커 설치로 복원할 수 있습니다.
gzcat /dir/file.tar.gz | docker load
속도는 훨씬 빠르지만 다음을 사용하여 압축하지 않는 데 더 많은 공간이 방법은 다음과 같습니다.
docker save container | dir/file.tar
그리고:
cat dir/file.tar | docker load
컨테이너에 연결하여 무언가를 설치하려는 경우
apt-get을 사용하여
먼저 우리 형제 "토마시 잘루스코"의 위와 같은 대답입니다.
docker exec -u root -t -i container_id /bin/bash
그럼 해보세요.
apt-get update 또는 apt-get '원하는 모든 것' 실행
모두에게 유용하기를 바랍니다.
승인된 답변과 달리, 저는 사용합니다.usermod
대신.
도커에 이미 root로 로그인했으며 "fruit"가 추가할 새 비루트 사용자 이름이라고 가정하고 다음 명령을 실행합니다.
apt update && apt install sudo
adduser fruit
usermod -aG sudo fruit
업데이트 후 이미지를 저장해야 합니다. 사용docker ps
현재 실행 중인 도커의 <컨테이너 ID> 및 <이미지>를 가져오려면 다음을 실행합니다.docker commit -m "added sudo user" <CONTAINER ID> <IMAGE>
도커 이미지를 저장합니다.
그런 다음 다음을 사용하여 테스트:
su fruit
sudo whoami
또는 도커를 시작할 때 루트 사용자가 아닌 사용자로 직접 로그인하여 테스트합니다(이미지 먼저 저장).
docker run -it --user fruit <IMAGE>
sudo whoami
사용할 수 있습니다.sudo -k
암호 프롬프트 타임스탬프를 재설정하려면:
sudo whoami # No password prompt
sudo -k # Invalidates the user's cached credentials
sudo whoami # This will prompt for password
컨테이너 내에서 SUDO 또는 apt-get에 액세스할 수 없는 경우 실행 중인 컨테이너에서 아래 옵션을 사용할 수 있습니다.
docker exec -u root -it f83b5c5bf413 ash
"f83b5c5bf413"이 제 컨테이너 ID이며 터미널의 작동 예는 다음과 같습니다.
루트가 아닌 사용자를 기본 이미지로 설정하는 방법은 다음과 같습니다.ubuntu:18.04
:
RUN \
groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
echo "Customized the sudoers file for passwordless access to the foo user!" && \
echo "foo user:"; su - foo -c id
위 코드에서 발생하는 현상:
- 사용자 및 그룹
foo
생성됩니다. - 사용자
foo
둘 다에 추가됩니다.foo
그리고.sudo
그룹. - 그
uid
그리고.gid
의 값으로 설정됩니다.999
. - 홈 디렉토리가 다음으로 설정됩니다.
/home/foo
. - 셸이 다음으로 설정됩니다.
/bin/bash
. - 그
sed
명령은 의 인라인 업데이트를 수행합니다./etc/sudoers
허용할 파일foo
그리고.root
사용자는 암호 없이 액세스할 수 있습니다.sudo
그룹. - 그
sed
명령을 실행하면 사용할 수 없습니다.#includedir
하위 디렉터리의 모든 파일이 이러한 인라인 업데이트를 재정의할 수 있도록 하는 지시문입니다.
모든 이미지에 대해 이 기능이 작동하지 않을 수 있지만 일부 이미지에는 주피터허브/단일 사용자 이미지와 같이 루트 사용자가 이미 포함되어 있습니다.이 이미지를 사용하면 다음과 같습니다.
USER root
RUN sudo apt-get update
주요 아이디어는 컨테이너에 따라 루트 사용자인 사용자를 생성해야 한다는 것입니다.
주 명령:
RUN echo "bot:bot" | chpasswd
RUN adduser bot sudo
첫 번째는 리터럴 문자열을 보냅니다.bot:bot
로.chpasswd
암호를 사용하여 사용자 봇을 만듭니다.bot
chpasswd는 다음을 수행합니다.
The chpasswd command reads a list of user name and password pairs from standard input and uses this information to update a group of existing users. Each line is of the format:
user_name:password
By default the supplied password must be in clear-text, and is encrypted by chpasswd. Also the password age will be updated, if present.
제가 생각하는 두 번째 명령은 사용자 봇을 sudo로 추가합니다.
재생할 수 있는 전체 도커 컨테이너:
FROM continuumio/miniconda3
# FROM --platform=linux/amd64 continuumio/miniconda3
MAINTAINER Brando Miranda "me@gmail.com"
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ssh \
git \
m4 \
libgmp-dev \
opam \
wget \
ca-certificates \
rsync \
strace \
gcc \
rlwrap \
sudo
# https://github.com/giampaolo/psutil/pull/2103
RUN useradd -m bot
# format for chpasswd user_name:password
RUN echo "bot:bot" | chpasswd
RUN adduser bot sudo
WORKDIR /home/bot
USER bot
#CMD /bin/bash
변경할 수 없는 스크립트를 실행하는 루트로 실행 중인 컨테이너가 있는 경우sudo
명령어를 사용하면 간단히 새 명령어를 생성할 수 있습니다.sudo
의 스크립트$PATH
전달된 명령을 호출합니다.
예: Docker 파일:
RUN if type sudo 2>/dev/null; then \
echo "The sudo command already exists... Skipping."; \
else \
echo -e "#!/bin/sh\n\${@}" > /usr/sbin/sudo; \
chmod +x /usr/sbin/sudo; \
fi
Centos7용 도커 파일의 예입니다.이 예제에서는 sudo 권한을 가진 prod_user를 추가합니다.
FROM centos:7
RUN yum -y update && yum clean all
RUN yum -y install openssh-server python3 sudo
RUN adduser -m prod_user && \
echo "MyPass*49?" | passwd prod_user --stdin && \
usermod -aG wheel prod_user && \
mkdir /home/prod_user/.ssh && \
chown prod_user:prod_user -R /home/prod_user/ && \
chmod 700 /home/prod_user/.ssh
RUN echo "prod_user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
echo "%wheel ALL=(ALL) ALL" >> /etc/sudoers
RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
RUN systemctl enable sshd.service
VOLUME [ "/sys/fs/cgroup" ]
ENTRYPOINT ["/usr/sbin/init"]
CentOS에서 이 작업을 수행하는 방법에 대한 답변이 없습니다.Centos에서 Docker 파일에 다음을 추가할 수 있습니다.
RUN echo "user ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/user && \
chmod 0440 /etc/sudoers.d/user
저는 Ubuntu 이미지를 사용하고 있는데 도커 데스크톱을 사용하면 이 문제가 발생했습니다.
다음은 이 문제를 해결한 방법입니다.
- 적절한 최신 정보
- 적절한 설치 sudo
언급URL : https://stackoverflow.com/questions/25845538/how-to-use-sudo-inside-a-docker-container
'programing' 카테고리의 다른 글
보기의 배경색 설정 방법 (0) | 2023.08.09 |
---|---|
Swift: 제네릭 형식이 프로토콜을 준수하는지 확인합니다. (0) | 2023.08.09 |
숨겨진 요소 내부에 Google 지도를 로드하는 방법 (0) | 2023.08.09 |
페이지를 이동하지 않고 브라우저에서 URL을 변경하는 방법은 무엇입니까? (0) | 2023.08.09 |
데이터 유형의 테이블 열을 참조하는 오라클 유형을 만들려면 어떻게 해야 합니까? (0) | 2023.08.09 |