일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 신입사원
- 운영체제
- 디지털
- 컴퓨터과학
- 메모리
- OS
- Public
- 세마포어
- 깃
- 우리카드
- 스프링
- 개발
- Effective Java
- 깃허브
- 컴퓨터공학
- 스터디
- github
- 자바
- 공채
- spring
- 신입
- 정보처리기사
- 알고리즘
- 뮤텍스
- CS
- java
- package-private
- 이펙티브 자바
- 프로그래밍
- IT
- Today
- Total
주니어 개발자 성장기
도커 자바 환경문제 (xargs is not available) 본문
개요
Cheffi 프로젝트를 진행하면서 develop 서버 자동 배포를 위해 도커파일을 작성하면서 생긴 이슈에 관해 말해보고자 한다.
필요한 도커 이미지 & 컨테이너
- 스프링 부트 애플리케이션 서버
- 레디스
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"]
'Spring > 프로젝트 pin' 카테고리의 다른 글
Swagger(스웨거) multipart/form-data에서 try out이 불가능한 문제 "Content-Type 'application/octet-stream' is not supported" (0) | 2024.04.17 |
---|---|
GitHub Actions - CI/CD 도입 - 1 (feat. Cheffi) (0) | 2023.09.12 |
깃허브 액션즈 노출되면 안되는 yml 파일 시크릿 등록 후 배포하기 (0) | 2023.08.20 |
(22.09.06) RestTemplate과 WebClient (0) | 2022.09.06 |
(22.08.23)Scheduling 관련 참고 (0) | 2022.08.23 |