카테고리 없음

'dockerfile의 ENTRYPOINT/CMD'에서 startup.sh 실행시, 환경변수 미인식 문제 해결하기

hyundai-ga-go-pa-yo 2024. 4. 21. 22:21

#shell 접속방식 #login/non-login session

 

 

문제상황 

도커 컨테이너를 실행시에 'startup.sh 스크립트'가 ARM 보드 타겟이 아닌 AMD64를 기준으로 C/C++ 소스코드를 빌드를 하는 의도치 않은 결과가 발생함.

 

기존에는 bash shell으로 컨테이너 안에 직접 접속해서, docker volume으로 공유되고 있는 docker host 디렉토리의 C/C++ 소스코드를 빌드하는 형태로 진행을 했다.

docker run --rm -it -v $(pwd):/workspace/project001/ toolchain-from-ubuntu20.04

 

매번 소스코드를 빌드하기 위해 컨테이너에 접속후 'rm -rf *' -> 'cmake ..' -> 'make && clean'의 명령어를 반복해서 치는게 에너지 낭비였다. 그래서 컨테이너를 실행하면 자동으로 빌드를 하고, 해당 컨테이너를 사라지게 만드는 이미지를 작성하려고 했다. 하지만 현실은 생각대로 움직여주지 않았고, 칼퇴근은 물넘어갔다.

칼퇴 가디마..

컨테이너 안에서는 ARM 보드 타겟으로 빌드가 정상적으로 되는데, 아래처럼 dockerfile에서 'startup.sh' 스크립트를 실행하면 AMD64로 빌드를 진행해서 오류가 났다.

FROM ubuntu:20.04

RUN tar -xf gcc-arm-none-eabi-10.3-202x.xx-src.tar -C /gcc-arm-none-eabi-10.3-202x.xx
RUN '. /gcc-arm-none-eabi-10.3-202x.xx/install-config.sh' >> ~/.bashrc

..(생략)..

WORKDIR /workspace

COPY <<EOF /startup.sh
#!/bin/bash

cd /workspace/project001
rm -rf build && mkdir build && cd build
cmake ..
make clean && make
EOF

RUN chmod +x /startup.sh

CMD ['bash','/startup.sh']

 

 

원인 

컨테이너 생성시에 실행되는 startup.sh가 툴체인 관련 환경변수를 인식하지 못했다.

분명 툴체인 관련 설정에 대한 이미지 내용은 똑같은데, 빌드 로그에서는 올바르지 않은 .so 파일 형식이라고 에러가 출력이 되었다. 하루종일 CMakeLists.txt를 만져봐도 해결이 안되길래, 만든 도커 이미지를 bash shell으로 접속해서 빌드를 하면 ARM 보드 타겟으로 빌드가 아~~주 잘!되!더!라!

 

별짓을 다해봐도 안되서 좌절쓰...

 

그래서  startup.sh 내용을 CMake와 관련된 환경변수의 설정값을 출력하도록 만들었더니, CC와 같은 환경변수 설정 자체가 출력이 안되더라...

 

 

해결법 

startup.sh 스크립트가 실행될 때, 툴체인 관련 환경변수를 인식할 수 있도록 했다.

FROM ubuntu:20.04

RUN tar -xf gcc-arm-none-eabi-10.3-202x.xx-src.tar -C /gcc-arm-none-eabi-10.3-202x.xx
RUN '. /gcc-arm-none-eabi-10.3-202x.xx/install-config.sh' >> ~/.bashrc

..(생략)..

WORKDIR /workspace

COPY <<EOF /startup.sh
#!/bin/bash

cd /workspace/project001
rm -rf build && mkdir build && cd build
cmake ..
make clean && make
EOF

RUN chmod +x /startup.sh

CMD ['bash','-l','-c','/startup.sh']

 

초반에는 startup.sh 내용에 'source /gcc-arm-none-eabi-10.3-202x.xx/install-config.sh'를 추가했다. 하지만 나중에 startup.sh 내용에서 'source /gcc-arm-none-eabi-10.3-202x.xx/install-config.sh'을 빠트릴거같다는 불길한 예감이 들었다. dockerfile의 CMD에서 툴체인 환경변수를 추가하도록, CMD ['bash','-c','s ource /gcc-arm-none-eabi-10.3-202x.xx/install-config.sh && /startup.sh']으로 설정을 해놓았다. 

 

왜 이렇게 해야하는지를 찾아보니 shell의 접속방식이 여러가지가 있다는 것을 알게 되었다. 그래서 최종적으로는 dockerfile의 CMD가 login shell으로 startup.sh를 실행하도록 설정을 했다.

 

[내가 언젠간 작성할 shell의 interactive/non-interactive + login/non-login 접속방식 포스트 링크]