変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

2025年4月11日

[podman]コンテナからごそっとファイルを取り出す場合

1ファイルなら

# podman cp {コンテナ名}:コピー元フルパスのファイル名 コピー先ファイル名

で済む。2個でも済むけど、多い時はフォルダごと

# podman cp {コンテナ名}:コピー元フルパスのディレクトリィ名/ コピー元ディレクトリィ名

して後はtarコマンドでまとめれば普通はOK。

但し、コマンドを実行したユーザに所有者が変わってしまい後々面倒なことになるので、

できればコンテナの中でtarファイルにした方がいい。

# パラメータチェック
if [ $# -eq 3 ]; then
  CONTER_NAME=$1
  TARGET_DIR=$2
  TARGET_TAR_PATH_NAME=$3
  TARGET_TAR_NAME=$(echo $TARGET_TAR_PATH_NAME | rev | cut -d'/' -f1 | rev) ※ファイル名のみ取得
  TMP_DIR="/tmp" ※都合悪い場合は書換え
  CMD1="podman exec -it ${CONTER_NAME} /bin/bash -c 'cd ${TARGET_DIR}; ls -l; tar zcvf ${TMP_DIR}/${TARGET_TAR_NAME} . ; ls -l ${TMP_DIR}/${TARGET_TAR_NAME}'"
    # cd ${TARGET_DIR}
    # ls -l ※無くてもOK
    # tar zcvf ${TMP_DIR}/${TARGET_TAR_NAME} . 
    # ls -l ${TMP_DIR}/${TARGET_TAR_NAME} ※無くてもOK
  CMD2="podman cp ${CONTER_NAME}:${TMP_DIR}/${TARGET_TAR_NAME} $TARGET_TAR_PATH_NAME"
  CMD3="podman exec -it ${CONTER_NAME} /bin/bash -c 'ls -l ${TMP_DIR}/${TARGET_TAR_NAME} ; rm -f ${TMP_DIR}/${TARGET_TAR_NAME} ; ls -l ${TMP_DIR}/${TARGET_TAR_NAME};'"
    # ls -l ${TMP_DIR}/${TARGET_TAR_NAME} ※無くてもOK
    # rm -f ${TMP_DIR}/${TARGET_TAR_NAME}
    # ls -l ${TMP_DIR}/${TARGET_TAR_NAME} ※無くてもOK
  CMD4="ls -l $TARGET_TAR_PATH_NAME"
  
  echo CMD1:$CMD1
  echo CMD2:$CMD2
  echo CMD3:$CMD3
  echo CMD4:$CMD4
  
  /bin/bash -c "$CMD1" > log.txt
  wait $!  ※いい感じで待ってくれる
  /bin/bash -c "$CMD2" >> log.txt
  wait $!  ※いい感じで待ってくれる
  /bin/bash -c "$CMD3" >> log.txt
  wait $!  ※いい感じで待ってくれる
  /bin/bash -c "$CMD4" >> log.txt
  wait $!  ※いい感じで待ってくれる
else
  echo usage: $0  {PODMAN_CONTER_NAME}  {FULL_PATH_IN_CONTER}  {OUTPUT_TAR_FILE_NAME}
  exit 1
fi

念のためTARGET_TAR_NAMEは、../conf.tar.gz とか保存先ディレクトリィを指定できる様にしてある。

余談

TARGET_TAR_NAMEが空っぽになるコード

TARGET_TAR_NAME=   $(echo $TARGET_TAR_PATH_NAME | rev | cut -d'/' -f1 | rev)

$(・・・)の前に空白があると、TARGET_TAR_NAMEが空文字列になってしまう。

TARGET_TAR_NAME=$(echo $TARGET_TAR_PATH_NAME | rev | cut -d'/' -f1 | rev)

昔のUNIX(SystemV)の頃のawkも(…)や{…}の前後のスペーシングに敏感だったが今はそんな事ないんでウッカリしてた。



[VSCode]デバッグコンソール

リモートホストに繋いでindex.jsを「デバッガの開始」すると

デバックコンソールに案内文(url付)を表示すると、ポートに①が付くので開くと、

urlのドメインがlocalhostなら困るだろうと自動的にポートフォワードするらしい。

デバックコンソールでCTRL+クリックでブラウザで開くとブラウザのURLが

デバックコンソールに表示しているポート番号からポートフォワードのポートに変わってる。

ちなみに、「ターミナル」を開くとcockpit入れてると、https://localhost:9090とか出るので、ポート9090をlocalhostの9090と同じ番号。10000未満だと違う番号にすると別のサービスに被るから変えてないのだろう。でも、VSCodeでデバッグする時だけポート番号が違うとメンドクサイので

「20090:20090」の様に2つ番号を入れれば好きな番号に振ってくれるので助かる。

でもこれだけでは繋がらない。リモート側で「20090:20090」という番号らしくないポート番号を開こうとして挫折してるっぽので、一旦「20090:20090」を削除して、今度は「20090」で作成。

あれ?たった今、https://localhost:9090が出なくなった?

でも、WindowsのコマンドラインからSSHすると

ここだけ表示する?

と思ったら、デバッグコンソールでも出るようになった。(怪しい

ps.2050/4/15

なぜlocalhost側のポート番号+1してしまうか不思議だったけど

自分でフォワードポートしたまま、listenしようとして失敗してたらしい。

よく見ると転送されたアドレスのlocalhost:9090あたりで右クリックしてローカルアドレスポートの変更を選択すると

こんな風に直接手入力で変更できる。

機能多すぎて説明を読む気もしないから

ショートカットもほぼ使ってない状況なせいかな?




top