2023. 12. 30. 20:19ㆍDevelopers 공간 [Shorts]/Software Basic
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew,
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter
- Module Bundler : React, Webpack, Parcel
B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS
C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight
1. What? (현상)
Dockerfile 내에서 아래와 같은 상황이 있다고 가정해봅니다.
/mnt/workspace/Parent
├── file.txt
├── ChildDir
├── Dockerfle
└── build_script.sh
└── ChildProject
Dockerfile 내용이 아래와 같고, build_script.sh파일이 있는 위치에서 아래와 같이 실행시 아래와 같은 에러가 날 것 입니다.
** 주의 : ubuntu에서 folder를 복사할 때 cp folder1 /folder2/ 를 실행하면 "folder1"을 folder2내부로 복사해 /folder2/folder1/contents 와 같이 생기겠지만, 이와 다르게 Dockerfile의 COPY는 "folder1의 내용"을 folder2로 복사해 /folder2/contents와 같이 생깁니다. 따라서 target directory를 명시해주는 것이 좋습니다.
...
COPY ../ChildProject /mnt/dockerspace/ChildProject
...
docker build -t my/repo2 .
COPY failed : forbidden path outside the build context : ../ChildProject ()
상대 경로는 통하지 않는 것 같습니다.
그럼 아래와 같이 다시 시도해보겠습니다. bash_script.sh에서 경로를 절대경로로 변경해주었습니다.
...
COPY /mnt/workspace/Parent/ChildProject /mnt/dockerspace/ChildProject
...
docker build -t my/repo2 .
COPY failed : file not found in build context or excluded by .dockerignore : stat mnt/workspace/Parent/ChildProject : file does not exist
현재 위치에서 실행되어서 그런지 절대 경로의 파일을 찾지 못합니다.
2. Why? (원인)
이전에 파일을 실행시 아래와 같이 마지막에 . 을 찍어주었습니다.
docker build -t my/repo2 .
docker가 build할 때 로컬에서는 /tmp/docker-123445와 같은 경로에서 실행됩니다. 하지만 마지막에 경로를 적어주는 이유는 Dockerfile 내부에서 로컬의 경로를 확인할 때는 현재 build가 진행되고 있는 context의 위치를 기준으로 빌드를 진행하므로 build context의 위치를 명시하기 위해서 입니다.
3. How? (해결책)
방법1. 위와 같은 이유로 마지막에 build context의 위치를 명령어 마지막에 우리가 원하는 위치로 변경해주어야 합니다. 그리고 Dockerfile의 위치를 -f 로 명시해줍니다. Dockerfile과 명령어는 아래와 같습니다.
역시나 build_script.sh파일이 있는 위치에서 아래와 같이 실행했습니다.
...
COPY ChildProject /mnt/dockerspace/ChildProject
...
docker build -f Dockerfile -t my/repo2 /mnt/workspace/Parent
** docker build 할 때 cache없이 명령을 실행하고 싶다면 docker build --no-cache -t my/repo2 . 로 실행해 줍니다.
방법2. shell script 내부에서 경로를 바꾸어주는 방법이있습니다.
...
COPY ChildProject /mnt/dockerspace/ChildProject
...
cp Dockerfile /mnt/workspace/Parent/
cd /mnt/workspace/Parent
echo $(pwd)
docker build -f Dockerfile -t my/repo2 .
rm Dockerfile
'Developers 공간 [Shorts] > Software Basic' 카테고리의 다른 글
[Python] 시간 및 메모리 체크 Template (0) | 2024.01.05 |
---|---|
[Bash] apt-get 사용시 GPG error(Couldn't create temporary file) (0) | 2023.12.31 |
[Python] Python과 PyTorch Copy 에 대해서 (0) | 2023.12.16 |
[Python] yaml, json,csv 읽고 쓰기 (0) | 2023.12.08 |
[Docker] no space left on device (0) | 2023.11.18 |