주니어 개발자 성장기

도커 자바 환경문제 (xargs is not available) 본문

Spring/프로젝트 pin

도커 자바 환경문제 (xargs is not available)

Junpyo Lee 2023. 8. 11. 20:21

개요

Cheffi 프로젝트를 진행하면서 develop 서버 자동 배포를 위해 도커파일을 작성하면서 생긴 이슈에 관해 말해보고자 한다.


필요한 도커 이미지 & 컨테이너

  1. 스프링 부트 애플리케이션 서버
  2. 레디스

Todo

  • 스프링 부트 환경설정 파일 분리 (application-dev.yml)
    • 컨테이너 이름으로 호스트 설정
  • 스프링 부트 도커파일 작성

  • 도커 컴포즈 파일 작성
    • 컨테이너 간 네트워크 연결

배포 툴

  • Github Actions


과정

먼저 Github Actions를 통해 배포하려면 yml 파일을 작성해야하는데, 나는 어떻게 작성하는 지 잘 몰라서 같은 팀원이 작성해준다고 했고 흐름은 다음과 같이 정했다.


Jar 파일 빌드 → SCP로 Jar파일과 dockerfile, docker-compose 를 EC2 호스트로 전송
→ docker-compose로 이미지 빌드 및 컨테이너 실행


Cheffi의 프로젝트 환경은 다음과 같다.

  • Spring Boot 3.0.8
    build.gradle 에서 확인 가능하다.
  • Gradle 8.1.1
    gradle/wrapper/gradle-wrapper.properties 에서 distributionUrl 속성으로 확인할 수 있다.


유틸리티 컨테이너

먼저 스프링 이미지를 위한 도커파일을 작성한 뒤에 Jar 파일을 빌드한 다음에 이미지가 정상적으로 빌드되는 지 확인 하려고 우선 다음과 같은 명령어로 jar 빌드를 시도해봤다.

./gradlew clean build

하지만 내 맥북에 설치된 자바 버전은 11이어서 오류가 났다. Gradle 8.1.1 버전에서는 적어도 Java17 이상이어야 한다는 오류가 떴다.
나는 여기서 그냥 내 노트북의 자바 버전을 변경할 수도 있었지만 예전에 도커 강의에서 배운 유틸리티 컨테이너를 통해 Jar 파일을 빌드를 해보기로 마음을 먹었다.


그래서 다음과 같은 도커 파일로 빌드를 시도해봤다.

#Dockerfile-helper

FROM openjdk:17-jdk

WORKDIR /app

COPY . .

CMD ["./gradlew","build"]

#docker-compose-helper.yml

version: '3.8'
services:
  helper:
    build:
      context: ./
      dockerfile: Dockerfile-helper
    volumes:
      - ./build/libs:/app/build/libs

이후 docker compose up 명령어로 이미지 빌드, 컨테이너 실행을 시도했지만
다음과 같은 에러메세지가 뜨며 빌드가 되지 않고 컨테이너가 종료되었다.

cheffi-helper-1  |  xargs is not available

구글링 결과 스택 오버플로우에서 다음과 같은 글을 찾았다.
Got error "xargs is not available" when trying to run a docker image


2번째 답변에서 오류의 이유를 찾을 수 있었다.
그래들 7.5 버전부터 xargs 에 대한 명시적인 체크가 이루어진다고 한다.
그리고 xargs의 존재(설치) 여부는 POSIX standard의 일부이기 때문에 없는 것은 극히 드문 경우라고 한다.


그렇지만 openjdk의 14버전 이상의 도커 이미지는 xargs를 포함하지 않는데 그 이유는 사용자제(deprecated)되었기 때문이라고 한다.


그리고 아래에서 xargs가 설치된 도커 이미지의 목록을 확인할 수 있다.
Unix start script doesn't respect JAVA_OPTS when xargs isn't installed · Issue #19682
정말로 xargs가 없는 이미지를 사용하고 싶다면 따로 설치하면 된다고 한다.


어쨌든 나는 위의 리스트 중에서 상업적으로 사용이 가능한 Zulu JDK를 사용하기로 했고 도커파일을 다음과 같이 수정해주었더니 정상적으로 빌드가 되었다.

FROM azul/zulu-openjdk-alpine:17-latest

WORKDIR /app

COPY . .

CMD ["./gradlew","build"]