github actions에서 runs-on 을 ubuntu-latest로 사용하는 경우, 이러한 문제가 발생하지 않지만, container를 직접 사용하는 경우, 예를 들어 runs-on은 ubuntu-latest지만 container의 image는 centos:7과 같이 사용하는 경우 node20 glibc 상위 버전 종속성 에러가 발생한다.
actions에서는 container를 생성(create)하는 과정에서 docker 명령에 필요한 옵션을 설정한다. 이 때 필요한 실행파일들을 외부에서 container 내부에서 사용하기 위해 /home/runner 하위의 디렉터리를 container의 특정 위치에 마운트(-v 옵션) 하는데, 이때 마운트하는 디렉터리 중 하나가 /home/runner/runners/2.321.0/externals 이다. 이 디렉터리는 container의 /__e 에 마운트 되며 read-only filesystem으로 인식되므로 actions의 yml에서 run으로 해당 디렉터리를 변조하는 것은 불가능하다.
container가 정상적으로 실행되면 이후에 actions에서 추가하여 사용하는 일반적인 action 중에 하나인 checkout, upload-artifact 등은 /__e/node20/bin/node 를 사용하는데 이 때 이 node의 라이브러리 종속성 에러가 발생한다.
이를 회피 하기 위해, container/image 를 지정하고, container/volumes를 지정하여 node20/bin을 다른 디렉터리로 마운트 한다.
예) 경로를 꼭 /home/runner/work/_temp
로 지정하지 않아도 되며, 실제 존재하는 경로로 지정하면 된다. 목적은 /__e/node20/bin/node가 마운트되지 않도록 하는 것이다.
# 이상 생략
jobs:
build:
runs-on: ubuntu-latest
container:
image: centos:7
volumes: # 강제로 node20을 사용하지 않도록 우회한다.
- '/home/runner/work/_temp:/__e/node20/bin'
# 이하 생략
이후에는 container 내에 위치한 node로 steps의 가장 상단에 소프트 링크를 생성하도록 명령을 추가해주면, github actions에서는 해당 실행파일로 필요한 action을 실행하게 된다.
# 이상 생략
steps:
- name: Node Version
run: |
node --version
ln -sf $(which node) /__e/node20/bin/node
/__e/node20/bin/node --version
# 이하 생략