Dockerfile에서 WORKDIR의 요점은 무엇입니까?
저는 Docker를 배우고 있습니다. 많은 시간 동안 나는 것을 본 적이 Dockerfile
있다 WORKDIR
명령을 :
FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
EXPOSE 3000
CMD [ “npm”, “start” ]
난 그냥 생략 할 수 없습니다 WORKDIR
와 Copy
단지 내를 Dockerfile
내 프로젝트의 루트에? 이 접근 방식을 사용하면 어떤 단점이 있습니까?
문서 에 따르면 :
WORKDIR 명령어는 Dockerfile에서 뒤 따르는 RUN, CMD, ENTRYPOINT, COPY 및 ADD 명령어에 대한 작업 디렉토리를 설정합니다.
또한 Docker 모범 사례 에서는 다음을 사용하는 것이 좋습니다.
... 읽기, 문제 해결 및 유지 관리가 어려운 RUN cd… && do-something과 같은 명령을 확산시키는 대신 WORKDIR을 사용해야합니다.
나는 그것을 유지하는 것이 좋습니다.
Dockerfile을 다음과 같이 리팩터링 할 수 있다고 생각합니다.
FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
COPY . ./
EXPOSE 3000
CMD [ “npm”, “start” ]
당신은 할 필요가 없습니다
RUN mkdir -p /usr/src/app
지정하면 자동으로 생성됩니다. WORKDIR
FROM node:latest
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
COPY . ./
EXPOSE 3000
CMD [ “npm”, “start” ]
컨테이너 내부 WORKDIR
처럼 생각할 수 있습니다 cd
(명령처럼 나중에 Dockerfile에 나오는 명령에 영향을 미침 RUN
). WORKDIR
위의 예에서 제거한 경우 컨테이너 내부 RUN npm install
의 /usr/src/app
디렉토리에 있지 않기 때문에 작동하지 않습니다 .
나는 이것이 Dockerfile을 넣은 위치와 어떻게 관련되는지 알지 못합니다 (호스트 컴퓨터의 Dockerfile 위치는 컨테이너 내부의 pwd와 관련이 없기 때문입니다). 프로젝트에서 원하는 곳에 Dockerfile을 배치 할 수 있습니다. 그러나의 첫 번째 인수 COPY
는 상대 경로이므로 Dockerfile을 이동하는 경우 해당 COPY
명령 을 업데이트해야 할 수 있습니다 .
WORKDIR 적용 전. 여기서 WORKDIR은 잘못된 위치에 있으며 현명하게 사용되지 않습니다.
FROM microsoft/aspnetcore:2
COPY --from=build-env /publish /publish
WORKDIR /publish
ENTRYPOINT ["dotnet", "/publish/api.dll"]
위의 코드를 수정하여 WORKDIR을 올바른 위치에 배치하고 다음 구문을 제거하여 최적화했습니다. /Publish
FROM microsoft/aspnetcore:2
WORKDIR /publish
COPY --from=build-env /publish .
ENTRYPOINT ["dotnet", "/api.dll"]
할 수 있으며 괜찮습니다. 디버깅 목적으로 컨테이너에 터미널을 가져오고 싶을 때가 있습니다.
docker exec -it [container-id] bash
그렇다면 어떤 사람들은 / usr / src / app에서 자신의 응용 프로그램을 찾는 것이 즐겁다 고 생각합니다. 또는 / mkasberg /. 또는 다른 전용 작업 디렉토리.
또 다른 가능성은 애플리케이션이 특정 절대 경로에 의존한다는 것입니다.
그 외에는 이것은 당신에게 달려 있습니다.
참조 URL : https://stackoverflow.com/questions/51066146/what-is-the-point-of-workdir-on-dockerfile
'Development Tip' 카테고리의 다른 글
두 개의 클래스가있는 getElementsByClassName () (0) | 2020.12.29 |
---|---|
Kotlin에서 "수신자"는 무엇입니까? (0) | 2020.12.29 |
다른 div 내에서 두 div를 가로로 배치하는 방법 (0) | 2020.12.29 |
Xcode : 소스 코드를 직접 수정하는 모든 빌드 전에 스크립트 실행 (0) | 2020.12.29 |
Document 개체에서 Window 개체를 가져 오는 방법은 무엇입니까? (0) | 2020.12.29 |