이야기박스
Intellij - Docker desktop; Spring Web app 이미지 만들기 본문
Intellij - Docker desktop; Spring Web app 이미지 만들기
박스님 2019. 10. 16. 12:01
# 개요
쿠버네티스에 webapp을 올려보기 위하여 이미지를 사전에 만들어보았습니다.
# 환경
- Spring Core 5.0.4.RELEASE
- Tomcat 8.5.37
- Intellij 2019.02
- Docker desktop community 2.1.0.3
IntelliJ에는 Docker을 설치해둔 상태입니다.
# Dockerfile
FROM tomcat:8-jre8-slim
RUN rm -rf /usr/local/tomcat/webapps/ROOT.war
COPY ./target/webapp.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh","run"]
# Intellij 설정
## 도커 연결
## 배포 설정
# 배포
## 이슈
위에서 정의한 Dockerfile의 배포가 실패하였습니다.
Deploying 'jwtest Dockerfile: webapp/Dockerfile'...
Failed to deploy 'jwtest Dockerfile: webapp/Dockerfile': Not connected to docker
FROM으로 정의해둔 톰캣 이미지(tomcat:8-jre8-slim)를 가져오지 못하더라고요.
위 톰캣 이미지를 로컬 저장소에 넣어둔 후, 다시 실행하니까 정상 동작이 확인되었습니다.
위 취소선은 잘못된 정보였습니다.
로컬 저장소에 이미지가 없어도 다시 시도하니 잘 동작하더라고요. 아마 도커가 제대로 안 뜬 상태에서 시도해서 발생한 에러 같습니다. 시간을 두고 다시 시도할 것!
## 배포 로그
Deploying 'jwtest Dockerfile: webapp/Dockerfile'...
Building image...
Step 1/4 : FROM tomcat:8-jre8-slim
---> 0a4770609ff8
Step 2/4 : RUN rm -rf /usr/local/tomcat/webapps/ROOT.war
---> Running in c6e6e74c0547
Removing intermediate container c6e6e74c0547
---> f9b7c6116bee
Step 3/4 : COPY ./target/webapp.war /usr/local/tomcat/webapps/ROOT.war
---> 7e0c844f3f09
Step 4/4 : CMD ["catalina.sh","run"]
---> Running in 8d2d00076bf1
Removing intermediate container 8d2d00076bf1
---> 0216ffd3c795
Successfully built 0216ffd3c795
Successfully tagged first:latest
Creating container...
Container Id: c5d99d3762dd96cbb1c6351c3ae00d55a54c42f4a0d3fd029bc698b9aa58eee9
Container name: 'jwtest'
Attaching to container 'jwtest'...
Starting container 'jwtest'
'jwtest Dockerfile: webapp/Dockerfile' has been deployed successfully.
# 실행
## 이슈1. 404 에러
webapp의 배포가 완료된 후, 동작 테스트를 해보려고 하니 404 에러가 발생하였습니다.
### 이슈 분석
404 에러가 발생했기 때문에, 톰캣 이슈는 아니라 판단하여 컨테이너 내부에서 ROOT 경로의 web.xml를 확인해보았습니다.
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
</web-app>
톰캣에서 기본으로 제공하는 webapp만 돌고 있더라고요. war 복사가 제대로 안된 거였습니다.
Dockerfile에서 명시해둔 step 2. 에서 ROOT.war 뿐 아니라 ROOT 디렉터리를 지웠어야 하더라고요. 톰캣의 내부 동작을 몰라서 발생했던 이슈였습니다.
Note. Tomcat은 초기 실행할 때, 디렉터리가 있으면 해당 경로의 내용을 실행하고 없는 경우에 war를 풀어서 사용합니다.
수정 내용은 다음과 같습니다.
# Before
rm -rf /usr/local/tomcat/webapps/ROOT.war
# After
rm -rf /usr/local/tomcat/webapps/ROOT
## 이슈 2. 스프링 프로파일
Spring Profile을 어떻게 지정해야 하나 고민했었는데, catalina.sh에서 JAVA_OPTS라는 변수를 읽기 때문에 이 환경변수에 값을 지정하여 해결하였습니다.
ENV JAVA_OPTS='-Dspring.profiles.active=local'
# 최종 Dockerfile
이미지가 생성되는 최종 Dockerfile은 다음과 같습니다.
FROM tomcat:8-jre8-slim
RUN rm -rf /usr/local/tomcat/webapps/ROOT
ENV JAVA_OPTS='-Dspring.profiles.active=local'
COPY ./target/webapp.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh","run"]
# 리뷰
처음으로 직접 도커 이미지를 만들다 보니 많은 시행착오가 있었네요.
다음에는 이 만든 이미지로 k8s 배포를 진행해보도록 하겠습니다.
'Computer & Data > Orchestration' 카테고리의 다른 글
(작성중) Docker <none>:<none> images (0) | 2019.11.14 |
---|---|
Kubernetes. 포드의 계산 리소스 관리 (3) | 2019.10.30 |
Kubernetes 9. Deployments (3) | 2019.09.04 |
Kubernetes 8. Accesing pod metadata and other resources from applications (0) | 2019.09.03 |
Kubernetes 7. ConfigMap & Secret (0) | 2019.08.28 |