인프런 커뮤니티 질문&답변

현석오님의 프로필 이미지
현석오

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

Docker 놀이터

도커파일로 장고 프로젝트 빌드 하고 런할때 manage.py 가 없다는 에러가 발생 합니다

작성

·

1.2K

·

수정됨

0

manage.py 가 없다고 나와요

 

vs code:

답변 11

0

현석오님의 프로필 이미지
현석오
질문자

일단 위처럼 하면 장고 첫화면 요청에 성공 합니다
그런데 이게 버젼 문제였는지 잘모르겠고 강의에서는

python -m django startproject backend2
인데 저는 python -m django startproject backend2 . 로 생성하니까 도커 파일 코드도 달라지고

ADD ./backend /code => ADD . /code


requirements.txt 위치도 달라진거 같고 뭔가 혼란스럽네여

최초 프로젝트 폴더 + manage.py 이렇게 하고 docker file 에서 Add . /Code 로 하고 내부적으로 코드 폴더 만들어서 거기다 복사한뒤 requirements.txt 도 거기서 실행하고
이런식인거 같은데 어려워요 차근 차근 파악해 나가야 겠죠 감사합니다

현석오님의 프로필 이미지
현석오
질문자

django 버젼 문제가 맞았던거 같습니다.

윈도우 피시에서 다시 하니까 안되서

버젼 수정하니까 되요

기억 할것:

루트 폴더에서
python -m pip install "django~=3.0.0"

루트 폴더에서
python -m django startproject backend2

루트 폴더에서
code .

vs code 열면
root
프로젝트 폴더
manage.py

이상태에서 다음 과정 진행

0

현석오님의 프로필 이미지
현석오
질문자

루트 폴더 prac-docker

  1. python -m django startproject backend2 .

  2. code .

  3. 도커 파일 추가

    prac-docker/Dockerfile

FROM ubuntu:18.04RUN apt-get update && apt-get install -y python3-pip python3-dev && apt-get clean

WORKDIR /code/
ADD . /code
RUN pip3 install -r requirements.txt

EXPOSE 8000
CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]

 

  1. prac-docker/requirement.txt

    django~=3.0.0

  2. vs code

  1. 빌드 및 실행 (도커 이미지 만들기 및 실행)

    ~/prac-docker
    docker build -t test_dj .
    docker run --rm -p 9000:8000 test_dj 

     

    test url:
    http://127.0.0.1:9000/

     

    test result:

 

 

 

 

0

현석오님의 프로필 이미지
현석오
질문자

재차 질문드리는데도 답변 해주셔서 감사합니다.

일단 python -m django startproject backend2 로 프로젝트 생성 이후에 settings.py 를 수정하지는 않았습니다.

혹시 아래 코드에 문제가 있을까여?

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

 

이진석님의 프로필 이미지
이진석
지식공유자

장고 프로젝트 생성에 사용된 장고 버전과, 도커 컨테이너 내에서 사용되는 장고 버전이 달라서 발생하는 이슈일 수도 있습니다. // 장고 내에서 BASE_DIR 값 설정에 pathlib을 사용하기 시작한 것이 장고 3.2 즈음이거든요. => 이는 아직 추측일 뿐입니다.

파이썬도 맥에서 사용하시는 python과 도커 컨테이너 내에서 사용되는 python은 다르며, 버전도 다를 수 있습니다. 장고 버전도 requirements.txt에 지정하시기에 따라서 다를 수도 있습니다.

맥에서 python -m django --version 명령의 출력결과가 어떠한 가요?

그리고 requirements.txt 파일 내역을 보여주세요.

그리고 도커 컨테이너 쉘로 진입하셔서, 도커 내의 파이썬 버전과 장고 버전은 어떻게 되나요?

맥> docker run --rm -it test_dj sh
컨테이너 쉘> python3 --version
컨테이너 쉘> python3 -m django --version

그리고, 현재 프로젝트의 코드를 그대로 공유해주시면, 저도 구성하신 대로 확인을 해보겠습니다.

화이팅입니다. :-)

현석오님의 프로필 이미지
현석오
질문자

❯ python -m django --version

4.1

 

❯ docker run --rm -it test_dj sh

# python3 --version

Python 3.6.9


requirements.txt
image

git:
https://github.com/hyunsokstar/prac_docker_backend2

입니다 감사합니다

이진석님의 프로필 이미지
이진석
지식공유자

보내주신 장고 프로젝트에서, 이 프로젝트는 장고 4.1에서 생성이 되었네요.
https://github.com/hyunsokstar/prac_docker_backend2/blob/88c3799c533b7e780e19227f88622bd56b1ab6fa/backend2/settings.py#L4

그리고, 도커 이미지에 설치되는 장고는 requirements.txt에 지정하신 대로 django~=3.0.0 장고 3.0 중 최신버전이 설치됩니다.
https://github.com/hyunsokstar/prac_docker_backend2/blob/88c3799c533b7e780e19227f88622bd56b1ab6fa/requirements.txt#L1

현재 Ubuntu 18.04 이미지에서는 python이 3.6.9 이구요.

장고 4.1 프로젝트의 코드들이 장고 3.0에서 지원되지 않는 몇 몇 설정들이 있어서 발생하는 오류입니다.

로컬에서도 장고 3.0을 설치하시어, 장고 3.0으로 장고 프로젝트를 생성하시면 해결될 문제입니다.


manage.py 파일과 backend2 폴더를 삭제하시고, 아래 명령으로 장고를 3.0 버전으로 재설치하신 뒤에

python -m pip install "django~=3.0.0"

아래 명령으로 현재 디렉토리에 장고 프로젝트를 다시 생성해주세요.

python -m django startproject backend2 . 끝에 마침표를 꼭 찍어주세요. 그렇지않으면 하위에 폴더가 하나 더 생깁니다.

그럼 개발 시의 장고 버전과 도커 컨테이너 에서의 장고 버전이 일치할 것입니다.
docker build 와 docker run 을 해보세요.

본 강의 진행 시에는 장고 3.0 기반으로 진행하시고, 강의가 끝나고, 장고에 대해서 어느 정도 익숙해지신 후에
도커 이미지 버전도 올려보시고 장고 버전도 최신버전으로 올려보시길 권해드립니다.


참고: 장고 4.1과 장고 3.0은 강의에서 다루는 내용들은 몇몇 설정들을 제외하고는 99% 동일합니다.

화이팅입니다. :-)

0

현석오님의 프로필 이미지
현석오
질문자

일단 빌드는 성공한것 같습니다. 그리고 실행도 일단은 강의 화면과 다르지 않습니다.

그런데 http://localhost:9000 으로 요청하면 아래처럼 출력 됩니다.

저번에 -it 옵션을 붙여서 다시 런 해보라고 하셨는데 어디에 해야 할까요?

방법1:

❯ docker run --rm -p 9000:8000 test_dj -it

docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-it": executable file not found in $PATH: unknown.

 

 

이진석님의 프로필 이미지
이진석
지식공유자

-it 옵션에 대해서는 보여주신 2가지 방법에서 출력화면에 답이 있습니다. 어떻게 해석이 되시나요?


그리고, 서버 실행 시에 오류가 있네요. 아래와 같이 뜨시는 걸 보니, 데이터베이스 계정정보 설정에 오류가 있는 듯 보입니다. settings.DATABASES 설정값을 확인하시고, 만약 환경변수로부터 로딩하셨다면, 그 값을 올바르게 지정되어있는 지 확인해주세요.

conn = Database.connect(**conn_params)
TypeError: argument 1 must be str, not PosixPath


아직 개발이나 장고에 익숙하지 않은 상황이시기에, 값을 설정하실 때 생각지도 못한 실수가 있을 수 있습니다. 강의대로 했습니다. 라고만 이야기해주시면 답을 찾기가 어렵습니다. 어떤 순서로 어떤 값을 넣으며 실습을 진행했고, 과정에 대한 스샷도 다양하게 남겨주시고, 각 설정에 대해서도 이해하신 만큼 설명해보려 해보신다면, 보다 좋은 학습 결과를 얻으실 수 있습니다. 저도 상황을 잘 파악할 수 있어서 더 좋은 답변을 드릴 수 있게 될 것입니다.

만약 한 번에 오류없이 실행이 된다고 해서, 그 내용을 본인이 이해한 상황은 아닐 것입니다. 단지 잘 따라친 것일 뿐이죠. 하루 이틀 지나면 금새 까먹습니다.

현재의 오류를 만나신 상황을 이 내용을 보다 잘 이해할 수 있는 기회로 생각해주세요.

화이팅입니다. ;-)

0

현석오님의 프로필 이미지
현석오
질문자

오늘 아침에 장고 프로젝트 생성 부터 다시 했는데 에러가 또 바뀌었어요 왜 이렇게 어렵죠

이진석님의 프로필 이미지
이진석
지식공유자

docker build 명령에서 -f 옵션은 Dockerfile 파일 외에 다른 경로의 도커파일을 참조할 때 사용하는 옵션입니다. -f test_dj 에서 test_dj 이름의 파일은 없어서 해당 오류가 발생한 것입니다. 옵션을 잘못 지정하셨구요. -f Dockerfile 와 같은 형태가 될텐데, 이는 디폴트로 지정되므로 생략하셔도 무방합니다.

docker build 명령시에 -f 도커파일경로 옵션이 없으니, 현재 경로에서 Dockerfile을 찾습니다. 그런데 현재 docker build 명령을 수행하는 경로에 Dockerfile 이 없어서 두 번째 오류가 발생한 것입니다.

모든 일이 그렇지만, 특히 컴퓨터에게 일을 시킬 때에는 정확하게 차근차근 일을 시켜야만 합니다. 사람에게는 대충 틀리게 지시해도 직관에 의해서 알아서 바른 길을 찾아가긴 하지만, 컴퓨터는 시킨 대로만 동작합니다.

조급해하시기보다, 차근차근 정리해보며, 하나씩 알아가셨으면 합니다.

화이팅입니다.

덧: 그런데, /Applicaitons/ 폴더는 시스템 폴더인데, 시스템 폴더에서 작업하시기보다 /Users/아이디/ 홈 디렉토리 아래에서 작업하시는 것이 안정적입니다.

0

현석오님의 프로필 이미지
현석오
질문자

아래처럼 되면 서버가 실행은 되는거겠죠? 이후 127.0.0.1:9000 으로 호출하면 최초에는 nginx 가 출력 되고 두번째에는 위처럼 에러 페이지인데 혹시 이유 아시면 알려주세여 감사합니다

이진석님의 프로필 이미지
이진석
지식공유자

docker run 시에 -it 옵션을 붙여서 실행하시면, 아래와 같이 좀 더 자세한 서버 출력 메세지가 뜹니다. 서버가 어떤 이유로 실행중이 아닐 수도 있습니다. 오류 상황을 봐야 해결할 수 있습니다. 오류상황이라면 아마도 오류메세지가 출력이 될 듯 합니다.

Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.

Run 'python manage.py migrate' to apply them.

February 15, 2023 - 11:40:00

Django version 3.1.14, using settings 'backend.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

이진석님의 프로필 이미지
이진석
지식공유자

image

0

현석오님의 프로필 이미지
현석오
질문자

일단 startapp 부터 다시 하니까 이렇게 까지 되는데요

127.0.0.1:8000 으로 요청하면 아래처럼 요청이 안되요

vs code

0

현석오님의 프로필 이미지
현석오
질문자

ADD ./backend /code => ADD . /code 로 바꾸면 arguments 가 2개 이어야 한다고 에러 나요 자꾸 똑같은 질문 해서 ㅈㅅ해여 ^^;

 

이진석님의 프로필 이미지
이진석
지식공유자

./backend 인자 대신에 . 를 지정한 것입니다.

ADD ./backend /code 에서도 인자가 2개죠.

아래와 같이 마침표와 /code 사이에 띄워쓰기를 쓰시어, 인자 2개로 쓰셔야 합니다. 아마도 붙여쓰신 건 아니신가 싶습니다.

image

화이팅입니다. :-)

0

현석오님의 프로필 이미지
현석오
질문자

mac 환경 입니다 .

폴더 구조는 강의와 동일한것 같습니다.


현재 폴더와 Dockerfile 은 다음과 같습니다.

빌드:

run:

 

도커 파일을 수정 하라는 말씀이신가요?

아니면 명령어를 바꿔야 될까요?

이진석님의 프로필 이미지
이진석
지식공유자

Dockerfile 내의 6번째 줄을 수정해주세요.

ADD 명령을 COPY로 잘못 말씀드렸네요.

ADD ./backend /code 가 아니라 , ADD . /code 로 말이죠.

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

VSCode를 통해 보여주신 파일/디렉토리 내역은
docker build 시에 만들어지는 도커 이미지로 복사되는 원본 파일/디렉토리입니다.

현재의 개발머신(윈도우)에 파일/디렉토리가 있더라도
지정 명령/설정에 따라 도커 이미지로 복사가 안 될 수 있습니다.

현재 프로젝트가 c:\Dev\backend 경로에 프로젝트가 있다고 했을 때

  • C:\Dev\backend 경로에 manage.py 파일이 있고

  • C:\Dev\backend 경로에 Dockerfile 파일이 있고

  • C:\Dev\backend 경로에 backend 폴더가 하나 더 있는 경우라고 해봅시다.

Dockerfile 내에 COPY ./backend /code 설정에서 backend는
C:\Dev\backend 폴더가 아니라 C:\Dev\backend\backend 폴더를 지정하게 되어
이 폴더가 도커 이미지 내의 /code 경로로 복사가 됩니다.

그러니 아마도 도커 이미지에는 manage.py 파일이 복사가 되지 않은 상황이며
디렉토리 구조가 온전치않은 상황인 것입니다.

복사 원본 경로는 ./backend 가 아니라, 현재 디렉토리를 의미하는 . 로 고쳐서, 다시 빌드해보시겠어요? 그럼 아래와 같이 됩니다.

COPY . /code

참고로, docker build 시에 도커 이미지에 포함시키고 싶지 않은 파일/폴더가 있다면
.dockerignore 파일에 그 파일명 패턴을 명시하시면 빠지게 되니, 나중에 활용해보세요.

디버깅 팁으로 docker run 시에 기본 명령으로 도커 컨테이너가 구동되는 것이 아니라,
커스텀 명령으로 도커 컨테이너를 구동할 수 있습니다. 아래와 같이 -it 옵션과 함께 sh 명령으로 구동하시면, 도커 컨테이너 안에서 쉘을 사용하실 수 있습니다.

docker run -it --rm -p 9000:8000 test_dj sh

쉘 안에서 파일들이 제대로 복사되었는 지, 혹은 환경변수 등이 제대로 설정되었는 지 등을 손쉽게 확인하실 수 있습니다.

차근차근 확인해보시고, 댓글 남겨주세요.

화이팅입니다. :-)

 

0

현석오님의 프로필 이미지
현석오
질문자

파일 구조가 잘못된 것일까요?

 

현석오님의 프로필 이미지
현석오

작성한 질문수

질문하기