[git] Docker 이미지 내의 사용자를 루트가 아닌 사용자로 전환

SSH 인증서를 설정하기 위해 사용자를 tomcat7 사용자로 전환하려고합니다.

할 때 su tomcat7아무 일도 일어나지 않습니다.

whoami 일을 한 후에도 여전히 루턴 su tomcat7

을 수행하면 more /etc/passwdtomcat7 사용자가 있음을 명확하게 보여주는 다음 결과가 나타납니다.

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
messagebus:x:101:104::/var/run/dbus:/bin/false
colord:x:102:105:colord colour management daemon,,,:/var/lib/colord:/bin/false
saned:x:103:106::/home/saned:/bin/false
tomcat7:x:104:107::/usr/share/tomcat7:/bin/false

내가 해결하려는 것은 Hudson의이 오류입니다.

Command "git fetch -t git@________.co.za:_______/_____________.git +refs/heads/*:refs/remotes/origin/*" returned status code 128: Host key verification failed.

이것은 내 Dockerfile이며 기존 hudson war 파일과 tarred 및 이미지를 빌드하는 구성을 취하고 hudson이 정상적으로 실행되며 사용자 tomcat7에 대해 존재하지 않는 인증서로 인해 git에 액세스 할 수 없습니다.

FROM debian:wheezy

# install java on image
RUN apt-get update
RUN apt-get install -y openjdk-7-jdk tomcat7

# install hudson on image
RUN rm -rf /var/lib/tomcat7/webapps/*
ADD ./ROOT.tar.gz /var/lib/tomcat7/webapps/

# copy hudson config over to image
RUN mkdir /usr/share/tomcat7/.hudson
ADD ./dothudson.tar.gz /usr/share/tomcat7/
RUN chown -R tomcat7:tomcat7 /usr/share/tomcat7/

# add ssh certificates
RUN mkdir /root/.ssh
ADD ssh.tar.gz /root/

# install some dependencies
RUN apt-get update
RUN apt-get install --y maven
RUN apt-get install --y git
RUN apt-get install --y subversion

# background script
ADD run.sh /root/run.sh
RUN chmod +x /root/run.sh

# expose port 8080
EXPOSE 8080


CMD ["/root/run.sh"]

최신 버전의 Docker (Docker 버전 1.0.0, 빌드 63fe64c / 1.0.0)를 사용하고 있습니다. 이것이 Docker의 버그입니까, 아니면 Dockerfile에 누락 된 것이 있습니까?



답변

dockerfilesu 에서 사용해서는 안되지만 Dockerfile 에서 USER명령을 사용해야합니다 .

Dockerfile 빌드 의 각 단계 에서 새 컨테이너가 생성되므로 사용자에 대한 변경 사항은 다음 빌드 단계에서 유지되지 않습니다.

예를 들면 :

RUN whoami
RUN su test
RUN whoami

이것은 사용자가 test두 번째 whoami에서 새 컨테이너가 생성되는 것과 같을 것이라고 결코 말하지 않습니다 . 출력은 둘 다에서 루트가됩니다 (물론 USER를 미리 실행하지 않는 한).

그러나 다음과 같은 경우 :

RUN whoami
USER test
RUN whoami

당신은 볼 수 roottest.

또는 sudo를 사용하여 다른 사용자로 명령을 실행할 수 있습니다.

sudo -u test whoami

그러나 공식적으로 지원되는 지침을 사용하는 것이 좋습니다.


답변

다른 답변에 대한 다른 접근 방식으로 Dockerfile에서 이미지 생성시 사용자를 나타내는 대신 특정 컨테이너의 명령 줄을 통해 명령별로 수행 할 수 있습니다.

docker exec, 사용 --user대화 형 터미널 의지 사용을 계정을 사용자 지정할 수는 (컨테이너가 실행되어야하고, 사용자가 컨테이너 시스템에 존재한다)

docker exec -it --user [username] [container] bash

참조 https://docs.docker.com/engine/reference/commandline/exec/를


답변

이 줄을 도커 파일에 추가

USER <your_user_name>

도커 명령어 USER 사용


답변

또한 다음을 수행 할 수 있어야합니다.

apt install sudo

sudo -i -u tomcat

그럼 당신은 바람둥이 사용자 여야합니다. 어떤 Linux 배포판을 사용하고 있는지 확실하지 않지만 예를 들어 Ubuntu 18.04 LTS에서 작동합니다.


답변

폴더 권한 변경과 같은 권한이있는 작업을 수행해야하는 경우 루트 사용자로 해당 작업을 수행 한 다음 권한이없는 사용자를 생성하고 전환 할 수 있습니다.

From <some-base-image:tag>

# Switch to root user
USER root # <--- Usually you won't be needed it - Depends on base image

# Run privileged command
RUN apt install <packages>
RUN apt <privileged command>

# Set user and group
ARG user=appuser
ARG group=appuser
ARG uid=1000
ARG gid=1000
RUN groupadd -g ${gid} ${group}
RUN useradd -u ${uid} -g ${group} -s /bin/sh -m ${user} # <--- the '-m' create a user home directory

# Switch to user
USER ${uid}:${gid}

# Run non-privileged command
RUN apt <non-privileged command>


답변

이 작업을 수행 할 실제 방법이 없습니다. 결과적으로 mysqld_safe와 같은 것은 실패하고, 40 개의 후프를 거치지 않고는 데비안 도커 컨테이너에 mysql-server를 설치할 수 없습니다.

USER를 사용할 수 있지만 루트가 아닌 경우 apt-get install을 수행 할 수 없습니다.


답변