기본적으로 pip를 사용하여 Python 패키지를 설치하고 있는데 실행하면 홈 디렉터리에서 구성 파일을 검색하고 그 안에 있는 정보를 사용하여 로그를 생성하고 보냅니다.
내 Macbook과 VirtualBox의 Ubuntu VM에서 실행하고 있습니다.
문제: Ubuntu Docker 이미지를 사용하여 동일한 작업을 수행하려고 했지만 구성 파일을 찾을 수 없습니다.
- 디렉터리 경로와 echo $PATH 결과는 컨테이너와 가상 머신에서 동일합니다.
- 구성 파일은 /home/user/에 있습니다.
- Docker 컨테이너를 시작했을 때 사용자가 없었기 때문에 "useradd -m USERNAME"을 사용하여 생성하고 sudo를 제공했습니다.
- 구성이 있는 사용자로 명령을 실행합니다.
이 문제를 일으킬 수 있는 가상 머신과 컨테이너 사이에 근본적인 차이점이 있나요? 사용자를 잘못 설정했나요?
답변1
컨테이너에서 작업 디렉터리는 프로세스를 실행하는 사용자가 정의하지 않습니다. 로그인이 발생하지 않았기 때문입니다.
가격 차이에 대해 문의하셨기 때문입니다. 가상 머신은 커널과 여러 프로세스가 포함된 운영 체제를 실행하는 베어메탈 컴퓨터를 시뮬레이션합니다. 이들 중 일부는 초기 작업 디렉터리와 같은 사용자 환경 설정 및 인증을 담당합니다.
반면에 컨테이너는포함하다하나 이상의 프로세스와 파일이 있지만 일반적으로 커널이나 시스템 관리자(예: systemd)를 실행하지 않습니다. 이는 파일 세트(실행 파일, 라이브러리 및 구성 형식)가 사용하기 위해 제공되는 영광스러운 chroot 환경과 비슷합니다. 컨테이너 내부에서 무엇이든 실행하는 것은 여전히 호스트의 커널에 따라 다르지만 다른 컨텍스트에서 실행됩니다. (Googlecgroup관심이 있으시면).
간단히 말해서, 컨테이너의 작업 디렉터리는 사용자가 설정한 것이 없기 때문에 사용자가 생각하는 것과 다릅니다. 따라서 몇 가지 옵션이 있습니다.
- 설정
WORKDIR
Dockerfile의 지침; - 짜증나는 짓을 하다
cd /home/user && <command>
- 컨테이너에 필요한 모든 항목에는 절대 경로를 사용하세요. 대부분의 프로그램은 명령줄 옵션을 구성 파일의 경로로 사용합니다.
컨테이너는 작업에 컨테이너 1개를 사용하는 경우 가장 유용합니다(관례인 것 같습니다). 따라서 /home
파일을 정리하고 useradd
. sudo가 필요하지 않습니다. 컨테이너의 논리가 반대입니다. 이미지를 빌드하고 설정할 수 있도록 루트로 시작합니다. 나중에 마지막 명령 이전에 컨테이너의 남은 수명 동안(일반적으로 명령이 종료될 때까지) 일반 사용자에게 권한을 포기할 수 있습니다.
/
기본 작업 디렉터리이기도 한 루트 디렉터리( )에 구성을 덤프하면 됩니다 . 사용USER
이 명령은 Docker에게 이 사용자로 프로그램을 실행하도록 지시합니다.
*위 단락의 두 링크는 모두 같은 페이지의 다른 부분으로 연결됩니다."Dockerfile 작성 모범 사례". 이것은 훌륭한 출발점입니다.
**컨테이너의 현재 작업 경로를 알아야 하는 경우 RUN pwd
Dockerfile의 명령 앞 아무 곳에나 삽입하세요.
편집하다:docker에는 python/pip 이미지를 빌드하는 방법에 대한 예제도 있습니다. https://docs.docker.com/언어/python/build-images/