programing

도커 파일에서 WORKDIR의 요점은 무엇입니까?

mailnote 2023. 7. 30. 18:00
반응형

도커 파일에서 WORKDIR의 요점은 무엇입니까?

도커를 배우고 있습니다.▁that요어▁times봤'▁for를 여러 번 보았습니다.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 내 그그냥내것을고리▁my▁have것.Dockerfile내 프로젝트의 뿌리에?이 접근 방식을 사용하면 어떤 단점이 있습니까?

설명서에 따르면:

WORKDIR 명령어는 Docker 파일의 RUN, CMD, ENTRINTPOINT, COPY 및 ADD 명령어에 대한 작업 디렉토리를 설정합니다.WORKDIR이 존재하지 않으면 이후의 Docker 파일 명령에 사용되지 않더라도 WORKDIR이 생성됩니다.

또한 Docker 모범 사례에서는 다음을 사용할 것을 권장합니다.

읽기, 문제 해결 및 유지 관리가 어려운 RUN cd & & do-thomething과 같은 지침을 확산시키는 대신 WORKDIR을 사용해야 합니다.

저는 그것을 유지하는 것을 제안합니다.

도커 파일을 다음과 같은 것으로 리팩터링할 수 있습니다.

FROM node:latest
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컨테이너 내부(이는 도커 파일의 나중에 오는 명령에 영향을 미칩니다.RUN명령경). 제거우를 .WORKDIR에서, 위의예서에,,RUN npm install당신이 없을 것이기 때문에 작동하지 않을 것입니다./usr/src/app컨테이너 내부의 디렉토리입니다.

저는 이것이 당신이 도커 파일을 어디에 두었는지와 어떻게 관련이 있는지 모르겠습니다(호스트 시스템의 도커 파일 위치는 컨테이너 내부의 pwd와 아무 관련이 없기 때문입니다).Docker 파일을 프로젝트의 원하는 위치에 놓을 수 있습니다. 첫 인수인 번주장은째첫만하지▁to에 대한 인수입니다.COPY이므로 도커 도커 파일을 할 수 .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"]

그래서 그것은 마치.cd다음 문장의 톤을 설정합니다.

@juanlumn의 답변도 좋지만, 한 가지 더 (중요한) 것을 추가하고 싶었습니다.

일반적인 명령줄에서 다음과 같은 경우cd당신이 바꿀 때까지 어딘가에 머물러 있습니다.각 Docker RUN명령은 루트 디렉터리에서 다시 시작됩니다!그것은 도커 초보자들을 위한 갓챠이고, 주의해야 할 것입니다.

그래서 뿐만 아니라,WORKDIR사용자의 코드를 읽는 다른 사용자에게 보다 명확한 시각적 신호를 제공하지만 하나 이상의 RUN 명령에 대한 작업 디렉토리도 유지합니다.

변수를 대상 디렉터리 이름으로 사용하지 않도록 주의하십시오.WORKDIR이 작업을 수행하면 "아무 것도 정상화하지 않음" 치명적인 오류가 발생하는 것으로 나타납니다.IMO, 또한 지적할 가치가 있습니다.WORKDIR와 동일한 방식으로 동작합니다.mkdir -p <path>즉, 경로의 모든 요소가 이미 존재하지 않는 경우 생성됩니다.

업데이트: 다단계 빌드를 실행하는 동안 변수와 관련된 문제(위에서 언급)가 발생했습니다. 이제 변수를 사용해도 문제가 없습니다. 변수가 "범위 내"인 경우(다음 2번째).WORKDIR참조 실패...

FROM <some image>
ENV varname varval
WORKDIR $varname

FROM <some other image>
WORKDIR $varname

반면에, 그것은 이것에 성공합니다...

FROM <some image>
ENV varname varval
WORKDIR $varname

FROM <some other image>
ENV varname varval
WORKDIR $varname

.oO(서류에 있을지도 모르고 놓쳤어요)

설정 위치를 주의하십시오.WORKDIR지속적인 통합 흐름에 영향을 미칠 수 있기 때문입니다.예를 들어, 다음으로 설정/home/circleci/project할 수 있습니다. 예를 들어, 오류가 발생합니다..ssh또는 원격 서클 ci가 설정 시간에 수행하는 작업입니다.

언급URL : https://stackoverflow.com/questions/51066146/what-is-the-point-of-workdir-on-dockerfile

반응형