구글 검색을 해보면 Docker 컨테이너는 기본적으로 unprivileged 모드로 동작한다고 한다. 컨테이너 내부에서 뭘 하든지 관여하지 않지만 도커가 설치된 시스템 자원을 건드리는 것은 안된다는 소리인 것 같다.
내가 이것을 찾아본 이유는 컨테이너에서 mount 명령어를 사용할 수 없었기 때문이다. 컨테이너를 만들 때, privileged 모드를 사용하도록 하면 된다.
sudo docker run --privileged
내가 잘 못하는 것인지는 모르겠는데, docker 에서 이미지를 만들 때 이상하게도 chmod 명령어가 먹히지를 않는다. 대부분의 경우에는 이 것이 문제가 되지는 않는데, 그럼에도 불구하고 chmod 를 적용시켜야 하는 경우도 있기 마련이다. cron 의 @reboot를 이용하니까 의외로 이게 된다. cron에서 @reboot 옵션으로 실행시킬 때 의외로 그냥 실행하면 안되는 경우도 있는데, 보통 이럴 때에는 부팅에 충분한 시간이 흐른 후에 실행하도록 sleep 옵션을 주면 된다.
Dockerfile 에서 다음과 같이 실행하도록 한다. 이 부분에 앞서 cron 을 설치하는 부분이 있어야 한다.
RUN echo '@reboot root chmod 777 -Rf /var/www/blog' >> /etc/crontab
결과 분석된 텍스트 내용을 DB에 넣는 것은 쉬운데 업무용 DB로 넣는 것은 꽤 난감한 상황이다. 그럴 것이라고 예상했기 때문에 Web에서 긁어서 붙일 수 있는 포맷으로 우선 진행하기로 하였고, Shiny를 이용하기로 하였다.
기본적으로 Docker를 이용할 것이기 때문에, Docker 에서 Shiny Server를 설치하였다. Docker는 root가 기본 계정이라서 shiny-server.conf 파일을 수정해야 하는 줄 알고 한참을 진행하여 보았는데, connection 오류가 해결이 안되었다.
Docker 에서 Shiny Server를 설치하는 과정에서 shiny 계정으로 shiny-server 프로그램이 동작한다. 따라서 설정 파일에서 run_as 부분은 shiny로 그대로 두어야 올바르게 동작한다.
Nginx 에서 reverse proxy 설정은 역시 열심히 여러 설정을 따라 해봤는데, 효과는 없었다. 나의 경우에는 ‘/’를 붙여주는게 간단하고도 유일한 효과를 발휘한 방법이었다.
location /shiny/ {
proxy_pass http://shiny.private:3838/;
}
도커 이미지를 빌드할 때 외부의 파일을 넣어야 하는 경우가 있다.
특정 파일에 특정 내용을 추가하면 되는 경우에는 echo 를 이용한다.
RUN echo "AAA" >> /etc/a.txt
특정 파일 내용을 바꿔야 하는 경우에는 sed를 이용한다. (맞나?)
RUN sed -i 's/FROM/TO/g' /etc/a.txt
특정 파일을 복사해서 넣어야 하는 경우에는 ADD와 COPY가 가능하다. ADD는 인터넷에 있는 파일도 입력해서 넣어줄 수 있는 장점이 있다. 단점으로는 내가 시도한 범위 내에서는 권한이 600으로 고정된다. 다른 권한을 부여하기 위해서는 미리 권한 변경을 한 파일을 빌드할 폴더에 넣어두고 COPY로 복사해서 넣어주면 된다.