programing

도커 용기 안에서 스도를 사용하는 방법은?

i4 2023. 8. 9. 20:29
반응형

도커 용기 안에서 스도를 사용하는 방법은?

일반적으로 도커 컨테이너는 사용자 루트를 사용하여 실행됩니다.다른 사용자를 사용하고 싶은데 도커의 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이며 터미널의 작동 예는 다음과 같습니다.

enter image description here

루트가 아닌 사용자를 기본 이미지로 설정하는 방법은 다음과 같습니다.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암호를 사용하여 사용자 봇을 만듭니다.botchpasswd는 다음을 수행합니다.

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 이미지를 사용하고 있는데 도커 데스크톱을 사용하면 이 문제가 발생했습니다.

다음은 이 문제를 해결한 방법입니다.

  1. 적절한 최신 정보
  2. 적절한 설치 sudo

언급URL : https://stackoverflow.com/questions/25845538/how-to-use-sudo-inside-a-docker-container

반응형