3.0.3에서 3.0.4로 업데이트 중 오류 발생: Error 523

안녕하세요!

launcher 유틸리티로 설치를 업그레이드하려고 할 때 문제가 발생했습니다.

빌드 컨테이너가 업로드된 이미지의 소유권을 변경하려고 할 때 오류 523이 발생합니다…

혹시 조언이 있을까요?

로그는 다음과 같습니다:

$ sudo ./launcher rebuild app
x86_64 arch detected.
WARNING: containers/app.yml file is world-readable. You can secure this file by running: chmod o-rwx containers/app.yml
Ensuring launcher is up to date
Fetching origin
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 app
app
2.0.20230502-0058: Pulling from discourse/base
Digest: sha256:fa95da36c3d3a582d644b139ec678f5778d745697454bc86f598c689031b30aa
Status: Image is up to date for discourse/base:2.0.20230502-0058
docker.io/discourse/base:2.0.20230502-0058
/usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups.rb
/usr/local/bin/pups --stdin

.....

Switched to a new branch 'stable'
I, [2023-06-18T16:43:24.458070 #1]  INFO -- : Branch 'stable' set up to track remote branch 'stable' from 'origin'.

I, [2023-06-18T16:43:24.458386 #1]  INFO -- : > cd /var/www/discourse && sudo -H -E -u discourse git config user.discourse-version stable
I, [2023-06-18T16:43:24.469320 #1]  INFO -- : 
I, [2023-06-18T16:43:24.469386 #1]  INFO -- : > cd /var/www/discourse && mkdir -p tmp
I, [2023-06-18T16:43:24.472481 #1]  INFO -- : 
I, [2023-06-18T16:43:24.472660 #1]  INFO -- : > cd /var/www/discourse && chown discourse:www-data tmp
I, [2023-06-18T16:43:24.476232 #1]  INFO -- : 
I, [2023-06-18T16:43:24.476303 #1]  INFO -- : > cd /var/www/discourse && mkdir -p tmp/pids
I, [2023-06-18T16:43:24.479386 #1]  INFO -- : 
I, [2023-06-18T16:43:24.479449 #1]  INFO -- : > cd /var/www/discourse && mkdir -p tmp/sockets
I, [2023-06-18T16:43:24.482943 #1]  INFO -- : 
I, [2023-06-18T16:43:24.483012 #1]  INFO -- : > cd /var/www/discourse && touch tmp/.gitkeep
I, [2023-06-18T16:43:24.486152 #1]  INFO -- : 
I, [2023-06-18T16:43:24.486220 #1]  INFO -- : > cd /var/www/discourse && mkdir -p                    /shared/log/rails
I, [2023-06-18T16:43:24.489788 #1]  INFO -- : 
I, [2023-06-18T16:43:24.489954 #1]  INFO -- : > cd /var/www/discourse && bash -c "touch -a           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log"
I, [2023-06-18T16:43:24.495214 #1]  INFO -- : 
I, [2023-06-18T16:43:24.495285 #1]  INFO -- : > cd /var/www/discourse && bash -c "ln    -s           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log"
I, [2023-06-18T16:43:24.500211 #1]  INFO -- : 
I, [2023-06-18T16:43:24.500283 #1]  INFO -- : > cd /var/www/discourse && bash -c "mkdir -p           /shared/{uploads,backups}"
I, [2023-06-18T16:43:24.504652 #1]  INFO -- : 
I, [2023-06-18T16:43:24.504738 #1]  INFO -- : > cd /var/www/discourse && bash -c "ln    -s           /shared/{uploads,backups} /var/www/discourse/public"
I, [2023-06-18T16:43:24.512836 #1]  INFO -- : 
I, [2023-06-18T16:43:24.512942 #1]  INFO -- : > cd /var/www/discourse && bash -c "mkdir -p           /shared/tmp/{backups,restores}"
I, [2023-06-18T16:43:24.518383 #1]  INFO -- : 
I, [2023-06-18T16:43:24.518453 #1]  INFO -- : > cd /var/www/discourse && bash -c "ln    -s           /shared/tmp/{backups,restores} /var/www/discourse/tmp"
I, [2023-06-18T16:43:24.523090 #1]  INFO -- : 
I, [2023-06-18T16:43:24.523195 #1]  INFO -- : > cd /var/www/discourse && chown -R discourse:www-data /shared/log/rails /shared/uploads /shared/backups /shared/tmp
chown: /shared/uploads/default/optimized/1X: Unknown error 523
chown: /shared/uploads/default/original/1X: Unknown error 523
I, [2023-06-18T16:43:41.385629 #1]  INFO -- : 


FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && chown -R discourse:www-data /shared/log/rails /shared/uploads /shared/backups /shared/tmp failed with return #<Process::Status: pid 135 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"code", "cmd"=>["sudo -H -E -u discourse git reset --hard", "sudo -H -E -u discourse git clean -f", "sudo -H -E -u discourse bash -c '\n  set -o errexit\n  if [ $(git rev-parse --is-shallow-repository) == \"true\" ]; then\n      git remote set-branches --add origin main\n      git remote set-branches origin $version\n      git fetch --depth 1 origin $version\n  else\n      git fetch --tags --prune-tags --prune --force origin\n  fi\n'", "sudo -H -E -u discourse bash -c '\n  set -o errexit\n  if [[ $(git symbolic-ref --short HEAD) == $version ]] ; then\n      git pull\n  else\n      git -c advice.detachedHead=false checkout $version\n  fi\n'", "sudo -H -E -u discourse git config user.discourse-version $version", "mkdir -p tmp", "chown discourse:www-data tmp", "mkdir -p tmp/pids", "mkdir -p tmp/sockets", "touch tmp/.gitkeep", "mkdir -p                    /shared/log/rails", "bash -c \"touch -a           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log\"", "bash -c \"ln    -s           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log $home/log\"", "bash -c \"mkdir -p           /shared/{uploads,backups}\"", "bash -c \"ln    -s           /shared/{uploads,backups} $home/public\"", "bash -c \"mkdir -p           /shared/tmp/{backups,restores}\"", "bash -c \"ln    -s           /shared/tmp/{backups,restores} $home/tmp\"", "chown -R discourse:www-data /shared/log/rails /shared/uploads /shared/backups /shared/tmp", "[ ! -d public/plugins ] || find public/plugins/ -maxdepth 1 -xtype l -delete"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.

이 오류에 대해 유용한 정보를 찾지 못했습니다. 사용 중인 OS 배포판과 버전은 무엇인가요? 업로드에 어떤 종류의 저장소가 사용되고 있나요?

‘stable’ 트랙을 사용하는 것이 비정상적인 접근 방식이라는 점에 대해 이미 알고 계실 것 같습니다. 거의 모든 사용자가 ‘tests-passed’ 트랙을 실행합니다. 관련 내용은
왜 Discourse는 기본적으로 “beta” 버전을 설치할까요?를 참고하세요.

S3를 사용하고 있다면, 버킷 이름이 올바르게 설정되어 있나요?

하지만 더 많이 실패해서는 안 되므로, 제 생각에는 이 부분은 무관하지 않나요?

매우 적은 설치만 stable을 사용한다면 실패가 덜 일어나는 것으로 보일 수도 있습니다. 또한 @gmoirod가 상황을 인지하고 있는지 확인하고 싶었습니다. stable을 실행하는 사람들 중 일부는 그것이 무엇인지 모르고 실행하고 있을 것이라고 추측했기 때문입니다.

그 점은 이해합니다. 하지만 지금 설치가 실패하고 있다면, 3.1.0beta5로 바로 전환하는 것이 상황을 훨씬 악화시킬 것이라 예상됩니다. 그러니 먼저 해당 문제에 집중합시다.

저는 Debian 11 서버 위에서 Docker 컨테이너로 Discourse를 실행하고 있습니다.
업로드는 공유 NFS 마운트에 저장되어 있습니다. 이전에도 항상 이렇게 운영해 왔으며, 이런 문제는 처음 겪어 봅니다.

네, 이 부분에 대해 여러 가지를 확인해 보았습니다. 언젠가 전환해 봐야 할 것 같습니다…
저는 어느 정도 Debian 쪽을 선호하는 편입니다. 프로덕션 환경에서는 'stable’을 유지하는 것이 좋습니다.

그렇군요. 현재 컨테이너 내부에서 해당 마운트에 접근할 수 있나요?

실제로 실행 중인 Discourse 3.0.3 컨테이너의 설정은 다음과 같습니다:

            {
                "Type": "bind",
                "Source": "/nfsdata/discourse-data-shared/uploads",
                "Destination": "/shared/uploads",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },

컨테이너 내부에서 소유권과 권한은 정상적으로 보입니다.

$ sudo docker exec app sh -c "ls -al /shared/uploads /shared/uploads/default/optimized/1X /shared/uploads/default/original/1X"
/shared/uploads:
total 4
drwxr-xr-x  2 discourse www-data    0 Jun 20 20:07 .
drwxr-xr-x 10 root      root     4096 Mar  8 16:29 ..
drwxr-xr-x  2 discourse www-data    0 Jun  8  2022 default
drwxr-xr-x  2 discourse www-data    0 Mar  8 17:34 tombstone

/shared/uploads/default/optimized/1X:
total 17094
drwxr-xr-x 2 discourse www-data      0 Mar 22 11:30 .
drwxr-xr-x 2 discourse www-data      0 Mar  8 16:18 ..
-rw-r--r-- 1 discourse www-data  54700 Mar  8 16:52 00964701d199ec0d6d3dd5269c842e1f0bb7e7a1_2_1035x456.png
-rw-r--r-- 1 discourse www-data    205 Mar  8 16:52 00964701d199ec0d6d3dd5269c842e1f0bb7e7a1_2_10x10.png
.....

/shared/uploads/default/original/1X:
total 17932
drwxr-xr-x 2 discourse www-data       0 Apr 23 11:42 .
drwxr-xr-x 2 discourse www-data       0 Jun  8  2022 ..
-rw-r--r-- 1 discourse www-data   35706 Nov 18  2022 00964701d199ec0d6d3dd5269c842e1f0bb7e7a1.png
-rwxr-xr-x 1 discourse www-data   17112 Jul  4  2022 00a82b03ffbcdf56e34f86adbec263e12573f49b.png

또한, 실행 중인 Discourse 3.0.3에서 새 이미지를 업로드하는 것도 가능합니다.

정확성: SELinux/AppArmor가 활성화되어 있지 않습니다

이 문제가 관련이 없기를 바랍니다 :sob: I Challenge Thee

사실 이것은 NFS에 있는 저장소의 문제가 아닙니다. NFS 마운트된 클라이언트 디렉토리의 문제입니다.

문제는 Linux 커널의 NFS 버그로 밝혀졌으므로, 이 버그를 닫으셔도 될 것 같습니다.

무언가가 Google 검색에서 1위를 차지한다고 해서 그것이 가장 좋은 결과라는 뜻은 아닙니다.

날짜: 2001년 6월 28일 목요일 20:03:01 UTC

컨테이너 내부에서 chown을 실행할 수 있나요, 즉 실패하는 명령어를 수동으로 실행해 볼 수 있나요?

sudo docker exec app sh -c "chown -R discourse:discourse /shared/uploads/default/optimized/1X"

아니요, 불가능합니다 (초기 실행된 명령어로 수정했습니다) …

$ docker exec -it app bash
app:/$ cd /var/www/discourse
app:/var/www/discourse$ chown -R discourse:www-data /shared/uploads
app:/var/www/discourse$ echo $?
0

시간이 오래 걸렸지만 에러는 발생하지 않았습니다.

3.0.3에서 실행되는 도커 이미지와 3.0.4에서 이미지를 빌드하는 데 사용된 이미지 사이에 차이가 있나요?

도커 이미지 버전은 Discourse 버전과 연결되어 있지 않습니다. 또한 이전 빌드 방식에 따라 달라지므로 단정하기 어렵습니다.

실제로 사용하는 3.0.3 이미지는 다음과 같은 결과를 반환합니다.

# docker image inspect local_discourse/app | grep 'discourse/base'
            "Image": "discourse/base:2.0.20230409-0052",

오류가 발생한 쪽에서는 다음을 사용했습니다:

Status: Image is up to date for discourse/base:2.0.20230502-0058

차이를 확인해 보겠습니다 :mag:

아니, 정말!
관련된 내용을 찾을 수 없어요: Comparing 3d317b7f58e8201912972afa3910b6c4b9ad8c75...main · discourse/discourse_docker · GitHub

네, 베이스 이미지에서 확실히 문제가 있습니다.
런처에서 discourse/base:2.0.20230409-0052를 강제 사용하도록 설정하니 완벽하게 작동했습니다.

# git diff launcher
diff --git a/launcher b/launcher
index 3e1a1c4..8a989b8 100755
--- a/launcher
+++ b/launcher
@@ -92,7 +92,7 @@ kernel_min_version='4.4.0'
 config_file=containers/"$config".yml
 cidbootstrap=cids/"$config"_bootstrap.cid
 local_discourse=local_discourse
-image="discourse/base:2.0.20230502-0058"
+image="discourse/base:2.0.20230409-0052"
 docker_path=`which docker.io 2> /dev/null || which docker`
 git_path=`which git`

이 문제를 일으키는 변경 사항이 무엇인지 확인하실 수 있는 분 계신가요?

믿기 어렵겠지만, discourse/base:2.0.20230502-0058로 다시 빌드했는데 통과했습니다… :man_shrugging:

컴퓨터의 기발한 장난을 믿는 건 전혀 어렵지 않아요 :upside_down_face: