「postgresql on docker」ネタのうちのひとつ、のやや続き

ほんとにひとつ前のまんま続き。

「とにかく一つ実際に動くものが実例としてあるといろいろ便利だろう(今後の雛形になるかも)と思って、一つ作ってみたのがこれ」のバージョン2である:

dockerbuild.sh (version 2)
 1 #! /bin/sh
 2 entsh=dockerentry$$.sh
 3 trap 'rm -f ${entsh} requirements.txt Dockerfile' 0 1 2 3 15
 4 
 5 # -------------------
 6 _USER=mypg
 7 _DB=mydb
 8 _PGPASS=asdfg
 9 
10 # -------------------
11 cat << __END__ > ${entsh}
12 #! /bin/sh -x
13 trap 'sudo -u postgres pg_ctlcluster 9.5 main stop' 0 1 2 3 15
14 sudo -u postgres pg_ctlcluster 9.5 main start
15 sleep 10
16 
17 if psql -d "${_DB}" -c "SELECT 1" > /dev/null ; then
18     :
19 else
20     sudo -u postgres createuser ${_USER} -d
21     # version 1 ではエンコーディングを無頓着にやってしまったが、UTF8 にしとく。
22     # (未指定時は SQL_ASCII になる。)
23     sudo -u postgres createdb ${_DB} -O ${_USER} -E UTF8 -T template0
24     
25     psql -d ${_DB} <<EOF
26 CREATE TABLE t_mal_people (
27   peopleid BIGINT PRIMARY KEY,
28   canonical VARCHAR,
29   english VARCHAR,
30   japanese VARCHAR
31 )
32 ;
33 CREATE TABLE t_mal_anime (
34   animeid BIGINT PRIMARY KEY,
35   canonical VARCHAR,
36   english VARCHAR,
37   japanese VARCHAR,
38   premiered VARCHAR,
39   type VARCHAR
40 );
41 \\copy t_mal_people FROM '/home/${_USER}/allpeople.csv' HEADER DELIMITER ',' CSV;
42 \\copy t_mal_anime FROM '/home/${_USER}/allanime.csv' HEADER DELIMITER ',' CSV;
43 EOF
44 fi
45 
46 python3 //home/${_USER}/app.py
47 __END__
48 
49 # -------------------
50 sed 's@ *#.*$@@' <<__END__ > requirements.txt
51 psycopg2-binary<2.9  # Dropped support for Python 2.7, 3.4, 3.5 on psycopg 2.9.
52 soupsieve<2.2  # Dropped support for Python 3.5 on soupsieve 2.2.
53 beautifulsoup4<4.11.0  # Dropped support for Python 3.5 on bs4 4.11.0.
54 certifi<2022.5.18  # Dropped support for Python 3.5 on certifi 2022.5.18.
55 requests<2.26.0  # Dropped support for Python 3.5 on requests 2.26.0.
56 markupsafe<2  # Dropped support for Python 3.5 on markupsafe 2.0.0.
57 jinja2<3  # Dropped support for Python 3.5 on jinja2 3.0.0.
58 flask<2  # Dropped support for Python 3.5 on flask 2.0.0.
59 __END__
60 
61 # -------------------
62 cat << __END__ > Dockerfile
63 FROM ubuntu:16.04
64 
65 ENV DEBIAN_FRONTEND=noninteractive
66 SHELL ["/bin/bash", "-c"]
67 RUN apt-get update -y && apt-get upgrade
68 
69 ENV LANG=C.UTF-8
70 ENV LC_ALL=C.UTF-8
71 RUN apt-get install -yq --no-install-recommends postgresql postgresql-contrib postgresql-client libpq-dev
72 #RUN sed -i "/^#listen_addresses/alisten_addresses = '*'" /etc/postgresql/*/main/postgresql.conf
73 RUN apt-get install -yq --no-install-recommends sudo
74 RUN useradd -ms /bin/bash ${_USER}
75 RUN usermod -aG sudo ${_USER}
76 RUN echo '${_USER} ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/${_USER} && chmod 0440 /etc/sudoers.d/${_USER}
77 RUN echo 'localhost:5432:${_DB}:${_USER}:${_PGPASS}' > /home/${_USER}/.pgpass
78 RUN chmod 600 /home/${_USER}/.pgpass
79 
80 RUN apt-get install -yq --no-install-recommends python3 python3-pip
81 RUN apt-get install -yq --no-install-recommends python3-setuptools
82 COPY requirements.txt .
83 RUN python3 -m pip install -r requirements.txt
84 
85 USER ${_USER}
86 
87 COPY ${entsh} /home/${_USER}
88 RUN sudo chmod u+x /home/${_USER}/${entsh}
89 COPY *.csv /home/${_USER}
90 COPY app.py /home/${_USER}
91 ENTRYPOINT ["/home/${_USER}/${entsh}"]
92 __END__
93 
94 # -------------------
95 docker build -t ${1:-pg-xenial} .
96 #docker run -it --rm -p 8080:5000 -v db_maldata://var/lib/postgresql pg-xenial

ひとつ前との違いは、ボリュームマッピングでデータを引き継ぎ出来るというただ一点であって、diff を取ってもらえればわかるけれど、変更箇所もほんのわずかだけである。けれども、まぁ結構苦労した。苦労の内容は後述として、たとえばこういう使い方:

 1 [me@host: wk]$ ls
 2 allanime.csv
 3 allpeople.csv
 4 app.py
 5 cli.py
 6 dockerbuild.sh
 7 [me@host: wk]$ ./dockerbuild.sh pg-xenial
 8     ...
 9 [me@host: wk]$ # docker volume でボリュームを用意しておくことは不可欠ではないけれど、便利。
10 [me@host: wk]$ docker volume create db_maldata
11 db_maldata
12 [me@host: wk]$ docker run -it --rm -p 8080:5000 -v db_maldata://var/lib/postgresql pg-xenial
13    ...
14 + trap sudo -u postgres pg_ctlcluster 9.5 main stop 0 1 2 3 15
15 + sudo -u postgres pg_ctlcluster 9.5 main start
16 + sleep 30
17 + psql -d mydb -c SELECT 1
18 psql: FATAL:  role "mypg" does not exist
19 + sudo -u postgres createuser mypg -d
20 + sudo -u postgres createdb mydb -O mypg
21 + psql -d mydb
22 CREATE TABLE
23 CREATE TABLE
24 COPY 19543
25 COPY 15047
26 + python3 //home/mypg/app.py
27  * Serving Flask app "app" (lazy loading)
28  * Environment: production
29    WARNING: This is a development server. Do not use it in a production deployment.
30    Use a production WSGI server instead.
31  * Debug mode: off
32  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

Ctrl-C で止めて再度同じ run をした場合に、この振る舞いが昨日のと全く違う。今回のは、このようにボリュームマッピングをしている限りは、postgresql データを改めて投入したりはしない。

で、「苦労」の話ね。

まずは「sleep 10」については、これはまだ未解決かもしれない。「the database system is starting up」を回避するためにのつもりで入れてみたんだけれど、腑に落ちないし、解決になってるかもわからない。

一番厄介だったのは、措置としての「sudo -u postgres pg_ctlcluster 9.5 main stop」に対応する問題で、ちゃんと行儀よく stop しないと、二度目以降の start に失敗するのだよね。してこれ、今の場合のアプリケーションとしてのメインエントリである「python app.py」の ctrl-c での終了に反応して stop を起動しなければならんという点が意外とむつかしくて。解決したコードはこのようにちっとも難しく見えない構造になっている。けれど、ほんとに昨日のとの diff をしてみて欲しいけれど「exec "$@"」相当の部分が消えてるでしょ、この exec がダメだということに気付くのに結構時間がかかった。exec はプロセスを置き換えてしまうので、元プロセスが指示した trap は効かなくなっちゃうのよね。

あと、地味に /var/lib/postgresql に辿り着くのにも時間がかかってる。これは 9.5 という凄まじく古い postgresql だからなのかもしれないんだけれど、ネットでみかけた「PGDATA の標準」と違う場所なのよね。

最後の苦労は「データベースのデータ初期値投入が済んでいたら」の判定「if psql -d mydb -c "SELECT 1" > /dev/null ; then」部分。この「回答」はえらくシンプルだけれど、結構ここにたどり着かなくてな。「psql -c "SELECT 1 FROM pg_roles WHERE rolename="mypg"」ではダメなのよ、なぜならこの psql のコンテキストはこのワタシの例の場合は「データベース mypg」となり、ユーザをチェックするつもりが、先にデータベースの存在エラーを拾ってしまって、目的のチェックになっていないわけね。

ここまでのものでもまぁ初版としてはまぁまぁだとは思うのだけれど、やはり初期データ投入部分の柔軟性がないのが気になるので:

dockerbuild.sh (version 3)
 1 #! /bin/sh
 2 entsh=dockerentry$$.sh
 3 trap 'rm -f ${entsh} requirements.txt Dockerfile' 0 1 2 3 15
 4 
 5 # -------------------
 6 _USER=mypg
 7 _DB=mydb
 8 _PGPASS=asdfg
 9 
10 # -------------------
11 cat << __END__ > ${entsh}
12 #! /bin/sh -x
13 trap 'sudo -u postgres pg_ctlcluster 9.5 main stop' 0 1 2 3 15
14 sudo -u postgres pg_ctlcluster 9.5 main start
15 sleep 10
16 
17 if psql -d "${_DB}" -c "SELECT 1" > /dev/null ; then
18     :
19 else
20     sudo -u postgres createuser ${_USER} -d
21     sudo -u postgres createdb ${_DB} -O ${_USER} -E UTF8 -T template0
22     
23     psql -d ${_DB} <<EOF
24 CREATE TABLE t_mal_people (
25   peopleid BIGINT PRIMARY KEY,
26   canonical VARCHAR,
27   english VARCHAR,
28   japanese VARCHAR
29 )
30 ;
31 CREATE TABLE t_mal_anime (
32   animeid BIGINT PRIMARY KEY,
33   canonical VARCHAR,
34   english VARCHAR,
35   japanese VARCHAR,
36   premiered VARCHAR,
37   type VARCHAR
38 );
39 EOF
40 fi
41 if test \! -z "\$1" ; then
42     if python3 -c "import sys, tarfile ; sys.exit(not tarfile.is_tarfile('\$1'))" 2> /dev/null ; then
43         sudo -u postgres pg_restore -a "\$1" -d ${_DB}
44     else
45         sudo -u postgres psql -d ${_DB} < "\$1"
46     fi
47 fi
48 
49 python3 //home/${_USER}/app.py
50 __END__
51 
52 # -------------------
53 sed 's@ *#.*$@@' <<__END__ > requirements.txt
54 psycopg2-binary<2.9  # Dropped support for Python 2.7, 3.4, 3.5 on psycopg 2.9.
55 soupsieve<2.2  # Dropped support for Python 3.5 on soupsieve 2.2.
56 beautifulsoup4<4.11.0  # Dropped support for Python 3.5 on bs4 4.11.0.
57 certifi<2022.5.18  # Dropped support for Python 3.5 on certifi 2022.5.18.
58 requests<2.26.0  # Dropped support for Python 3.5 on requests 2.26.0.
59 markupsafe<2  # Dropped support for Python 3.5 on markupsafe 2.0.0.
60 jinja2<3  # Dropped support for Python 3.5 on jinja2 3.0.0.
61 flask<2  # Dropped support for Python 3.5 on flask 2.0.0.
62 __END__
63 
64 # -------------------
65 cat << __END__ > Dockerfile
66 FROM ubuntu:16.04
67 
68 ENV DEBIAN_FRONTEND=noninteractive
69 SHELL ["/bin/bash", "-c"]
70 RUN apt-get update -y && apt-get upgrade
71 
72 ENV LANG=C.UTF-8
73 ENV LC_ALL=C.UTF-8
74 RUN apt-get install -yq --no-install-recommends postgresql postgresql-contrib postgresql-client libpq-dev
75 #RUN sed -i "/^#listen_addresses/alisten_addresses = '*'" /etc/postgresql/*/main/postgresql.conf
76 RUN apt-get install -yq --no-install-recommends sudo
77 RUN useradd -ms /bin/bash ${_USER}
78 RUN usermod -aG sudo ${_USER}
79 RUN echo '${_USER} ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/${_USER} && chmod 0440 /etc/sudoers.d/${_USER}
80 RUN echo 'localhost:5432:${_DB}:${_USER}:${_PGPASS}' > /home/${_USER}/.pgpass
81 RUN chmod 600 /home/${_USER}/.pgpass
82 
83 RUN apt-get install -yq --no-install-recommends python3 python3-pip
84 RUN apt-get install -yq --no-install-recommends python3-setuptools
85 COPY requirements.txt .
86 RUN python3 -m pip install -r requirements.txt
87 
88 USER ${_USER}
89 
90 COPY ${entsh} /home/${_USER}
91 RUN sudo chmod u+x /home/${_USER}/${entsh}
92 COPY app.py /home/${_USER}
93 ENTRYPOINT ["/home/${_USER}/${entsh}"]
94 __END__
95 
96 # -------------------
97 docker build -t ${1:-pg-xenial} .
98 #docker run -it --rm -p 8080:5000 -v db_maldata://var/lib/postgresql -v $(pwd)://wk pg-xenial //wk/dump_0.dmp

最後の行に run の例としてのコメントを入れてある。dump_0.dmp は例えば:

1 \copy t_mal_people FROM '/wk/allpeople.csv' HEADER DELIMITER ',' CSV;
2 \copy t_mal_anime FROM '/wk/allanime.csv' HEADER DELIMITER ',' CSV;

のような psql スクリプトか、もしくは pg_dump の -F tar フォーマットのダンプファイル。version 2 では docker コンテナに allpeople.csv, allanime.csv を COPY していたけれど、version 3 はこのような仕組みなのでそれはもはや必要ない、てこと。

なおこの version 2 から version 3 に至るのも結構苦労はしているけれど、単にワタシの不慣れ起因なので説明するようなものではない。

さて、今回も改めて注意しておくけれど、「FROM ubuntu:16.04」とそれに引きずられての細かい requirements.txt のバージョン指定はこれは「今日のオレの用事」に必要だからそうしているだけであって、まずは「FROM ubuntu:16.04」(ととりわけ python 3.5)というのはとてつもなく古い環境であるという点はお忘れなく。

あとついでなので。flask だけでサービスしようとすれば、上の実行例でも見えてる通り

WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.

と警告されるわけだ。これは python 標準ライブラリの http.server にある出来合いのサーバと同じなので理由はわかるであろう。原則としてこれらは「開発時の仮サーバ」のためだけに用意されている。ゆえに何かを使わねばならぬ、ということだが、uwsgi を使う場合は例えば:

dockerbuild.sh (version 4)
  1 #! /bin/sh
  2 entsh=dockerentry$$.sh
  3 trap 'rm -f ${entsh} requirements.txt Dockerfile' 0 1 2 3 15
  4 
  5 # -------------------
  6 _USER=mypg
  7 _DB=mydb
  8 _PGPASS=asdfg
  9 
 10 # -------------------
 11 cat << __END__ > ${entsh}
 12 #! /bin/sh -x
 13 trap 'sudo -u postgres pg_ctlcluster 9.5 main stop' 0 1 2 3 15
 14 sudo -u postgres pg_ctlcluster 9.5 main start
 15 sleep 10
 16 
 17 if psql -d "${_DB}" -c "SELECT 1" > /dev/null ; then
 18     :
 19 else
 20     sudo -u postgres createuser ${_USER} -d
 21     sudo -u postgres createdb ${_DB} -O ${_USER} -E UTF8 -T template0
 22     
 23     psql -d ${_DB} <<EOF
 24 CREATE TABLE t_mal_people (
 25   peopleid BIGINT PRIMARY KEY,
 26   canonical VARCHAR,
 27   english VARCHAR,
 28   japanese VARCHAR
 29 )
 30 ;
 31 CREATE TABLE t_mal_anime (
 32   animeid BIGINT PRIMARY KEY,
 33   canonical VARCHAR,
 34   english VARCHAR,
 35   japanese VARCHAR,
 36   premiered VARCHAR,
 37   type VARCHAR
 38 );
 39 EOF
 40 fi
 41 if test \! -z "\$1" ; then
 42     if python3 -c "import sys, tarfile ; sys.exit(not tarfile.is_tarfile('\$1'))" 2> /dev/null ; then
 43         sudo -u postgres pg_restore -a "\$1" -d ${_DB}
 44     else
 45         sudo -u postgres psql -d ${_DB} < "\$1"
 46     fi
 47 fi
 48 
 49 #python3 //home/${_USER}/app.py
 50 (
 51     cd //home/${_USER}/
 52     uwsgi --http 0.0.0.0:5000 --master -w app:app
 53 )
 54 __END__
 55 
 56 # -------------------
 57 sed 's@ *#.*$@@' <<__END__ > requirements.txt
 58 psycopg2-binary<2.9  # Dropped support for Python 2.7, 3.4, 3.5 on psycopg 2.9.
 59 soupsieve<2.2  # Dropped support for Python 3.5 on soupsieve 2.2.
 60 beautifulsoup4<4.11.0  # Dropped support for Python 3.5 on bs4 4.11.0.
 61 certifi<2022.5.18  # Dropped support for Python 3.5 on certifi 2022.5.18.
 62 requests<2.26.0  # Dropped support for Python 3.5 on requests 2.26.0.
 63 markupsafe<2  # Dropped support for Python 3.5 on markupsafe 2.0.0.
 64 jinja2<3  # Dropped support for Python 3.5 on jinja2 3.0.0.
 65 flask<2  # Dropped support for Python 3.5 on flask 2.0.0.
 66 __END__
 67 
 68 # -------------------
 69 cat << __END__ > Dockerfile
 70 FROM ubuntu:16.04
 71 
 72 ENV DEBIAN_FRONTEND=noninteractive
 73 SHELL ["/bin/bash", "-c"]
 74 RUN apt-get update -y && apt-get upgrade
 75 
 76 ENV LANG=C.UTF-8
 77 ENV LC_ALL=C.UTF-8
 78 RUN apt-get install -yq --no-install-recommends postgresql postgresql-contrib postgresql-client libpq-dev
 79 #RUN sed -i "/^#listen_addresses/alisten_addresses = '*'" /etc/postgresql/*/main/postgresql.conf
 80 RUN apt-get install -yq --no-install-recommends sudo
 81 RUN useradd -ms /bin/bash ${_USER}
 82 RUN usermod -aG sudo ${_USER}
 83 RUN echo '${_USER} ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/${_USER} && chmod 0440 /etc/sudoers.d/${_USER}
 84 RUN echo 'localhost:5432:${_DB}:${_USER}:${_PGPASS}' > /home/${_USER}/.pgpass
 85 RUN chmod 600 /home/${_USER}/.pgpass
 86 
 87 RUN apt-get install -yq --no-install-recommends python3 python3-pip
 88 RUN apt-get install -yq --no-install-recommends python3-setuptools
 89 COPY requirements.txt .
 90 RUN python3 -m pip install -r requirements.txt
 91 RUN apt-get install -yq build-essential
 92 RUN apt-get install -yq --no-install-recommends python3-dev
 93 RUN python3 -m pip install uwsgi
 94 
 95 USER ${_USER}
 96 
 97 COPY ${entsh} /home/${_USER}
 98 RUN sudo chmod u+x /home/${_USER}/${entsh}
 99 COPY app.py /home/${_USER}
100 ENTRYPOINT ["/home/${_USER}/${entsh}"]
101 __END__
102 
103 # -------------------
104 docker build -t ${1:-pg-xenial} .
105 #docker run -it --rm -p 8080:5000 -v db_maldata://var/lib/postgresql -v $(pwd)://wk pg-xenial //wk/dump_0.dmp

という具合ね。postgresql ネタとしては本題ではないけれど、大事といえば大事、これ。

さて、今回のこの括りの中ではもう話をやめようかとも思ったのだけれど、まだあったので、続ける。

ワタシの用事がまぁ特殊といえば特殊だし、ありがちといえばありがちなんだけれど、要は「凄まじく古いシステムの延命」に必要な検証用模擬環境の構築なわけなのよ。しかるに、「Ubuntu xenial(16.04) から見ると未来の postgresql (10.0) を導入する」ということが必要になった。言葉だけで言えばこれはとても単純な話に見えるだろうけれど、「そういう古い環境を今同じ状態に再構築したくても、外的要因で実現しにくい」のはあるあるである。一番わかりやすい条件は、「ダウンロード先が消えてなくなってしまった」というようなこと。

変更点だけみればやっぱり大したことには見えない:

dockerbuild.sh (version 5)
  1 #! /bin/sh
  2 entsh=dockerentry$$.sh
  3 trap 'rm -f ${entsh} requirements.txt Dockerfile' 0 1 2 3 15
  4 
  5 # -------------------
  6 _USER=mypg
  7 _DB=mydb
  8 _PGPASS=asdfg
  9 
 10 # -------------------
 11 cat << __END__ > ${entsh}
 12 #! /bin/sh -x
 13 trap 'sudo -u postgres pg_ctlcluster 10 main stop' 0 1 2 3 15
 14 sudo -u postgres pg_ctlcluster 10 main start
 15 sleep 10
 16 
 17 if psql -d "${_DB}" -c "SELECT 1" > /dev/null ; then
 18     :
 19 else
 20     sudo -u postgres createuser ${_USER} -d
 21     sudo -u postgres createdb ${_DB} -O ${_USER} -E UTF8 -T template0
 22     
 23     psql -d ${_DB} <<EOF
 24 CREATE TABLE t_mal_people (
 25   peopleid BIGINT PRIMARY KEY,
 26   canonical VARCHAR,
 27   english VARCHAR,
 28   japanese VARCHAR
 29 )
 30 ;
 31 CREATE TABLE t_mal_anime (
 32   animeid BIGINT PRIMARY KEY,
 33   canonical VARCHAR,
 34   english VARCHAR,
 35   japanese VARCHAR,
 36   premiered VARCHAR,
 37   type VARCHAR
 38 );
 39 EOF
 40 fi
 41 if test \! -z "\$1" ; then
 42     if python3 -c "import sys, tarfile ; sys.exit(not tarfile.is_tarfile('\$1'))" 2> /dev/null ; then
 43         sudo -u postgres pg_restore -a "\$1" -d ${_DB}
 44     else
 45         sudo -u postgres psql -d ${_DB} < "\$1"
 46     fi
 47 fi
 48 
 49 #python3 //home/${_USER}/app.py
 50 (
 51     cd //home/${_USER}/
 52     uwsgi --http 0.0.0.0:5000 --master -w app:app
 53 )
 54 __END__
 55 
 56 # -------------------
 57 sed 's@ *#.*$@@' <<__END__ > requirements.txt
 58 psycopg2-binary<2.9  # Dropped support for Python 2.7, 3.4, 3.5 on psycopg 2.9.
 59 soupsieve<2.2  # Dropped support for Python 3.5 on soupsieve 2.2.
 60 beautifulsoup4<4.11.0  # Dropped support for Python 3.5 on bs4 4.11.0.
 61 certifi<2022.5.18  # Dropped support for Python 3.5 on certifi 2022.5.18.
 62 requests<2.26.0  # Dropped support for Python 3.5 on requests 2.26.0.
 63 markupsafe<2  # Dropped support for Python 3.5 on markupsafe 2.0.0.
 64 jinja2<3  # Dropped support for Python 3.5 on jinja2 3.0.0.
 65 flask<2  # Dropped support for Python 3.5 on flask 2.0.0.
 66 __END__
 67 
 68 # -------------------
 69 cat << __END__ > Dockerfile
 70 FROM ubuntu:16.04
 71 
 72 ENV DEBIAN_FRONTEND=noninteractive
 73 SHELL ["/bin/bash", "-c"]
 74 RUN apt-get update -y && apt-get upgrade
 75 
 76 ENV LANG=C.UTF-8
 77 ENV LC_ALL=C.UTF-8
 78 RUN echo "deb https://apt-archive.postgresql.org/pub/repos/apt/ xenial-pgdg main" > /etc/apt/sources.list.d/postgresql-pgdg.list
 79 RUN apt-get install -yq apt-transport-https
 80 RUN apt-get update -y
 81 RUN apt-get install -yq --no-install-recommends --allow-unauthenticated \
 82     postgresql-10 #postgresql-contrib postgresql-client libpq-dev
 83 #RUN sed -i "/^#listen_addresses/alisten_addresses = '*'" /etc/postgresql/*/main/postgresql.conf
 84 RUN apt-get install -yq --no-install-recommends sudo
 85 RUN useradd -ms /bin/bash ${_USER}
 86 RUN usermod -aG sudo ${_USER}
 87 RUN echo '${_USER} ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/${_USER} && chmod 0440 /etc/sudoers.d/${_USER}
 88 RUN echo 'localhost:5432:${_DB}:${_USER}:${_PGPASS}' > /home/${_USER}/.pgpass
 89 RUN chmod 600 /home/${_USER}/.pgpass
 90 
 91 RUN apt-get install -yq --no-install-recommends python3 python3-pip
 92 RUN apt-get install -yq --no-install-recommends python3-setuptools
 93 COPY requirements.txt .
 94 RUN python3 -m pip install -r requirements.txt
 95 RUN apt-get install -yq build-essential
 96 RUN apt-get install -yq --no-install-recommends python3-dev
 97 RUN python3 -m pip install uwsgi
 98 
 99 USER ${_USER}
100 
101 COPY ${entsh} /home/${_USER}
102 RUN sudo chmod u+x /home/${_USER}/${entsh}
103 COPY app.py /home/${_USER}
104 ENTRYPOINT ["/home/${_USER}/${entsh}"]
105 __END__
106 
107 # -------------------
108 docker build -t ${1:-pg-xenial} .
109 #docker run -it --rm -p 8080:5000 -v db_maldata://var/lib/postgresql -v $(pwd)://wk pg-xenial //wk/dump_0.dmp

過去からみた未来がまだ未来や近過去だった頃であれば、この措置のもとに出来るのは「How To Install Postgresql 10 on Ubuntu 16.04」。2020年2月に書かれた情報なので、この「過去からみた未来」はそれほど過去ではなかった、ということ。具体的に言えば、今この情報に従って Install Postgresql 10 on Ubuntu 16.04 しようと試みると、「postgresql apt が xenial サポートを打ち切った」ことの影響を喰らう。http://apt.postgresql.org/pub/repos/apt/dists/ に xenial のものがなくなっていることを確認し、さてどうしようか、てことである。

かなり長時間徘徊して、ようやっと https://apt-archive.postgresql.org/pub/repos/apt/ を発見出来た。けれどもこれに置き換えるだけだと「E: The method driver /usr/lib/apt/methods/http could not be found.」を喰らうので、ということで必要なのが apt-transport-https。これは正直なんじゃそりゃと思う。https と unix socket との違いというなら結構な大ごとだろうけど、https でなくて http だからという理由だけで問題を起こすようなシステム、久しぶりにみたぞ、と思うわなぁ。

それと、気持ちは悪いが --allow-unauthenticated ね。これは実は直前にこれも個人的用事で chrome のインストールも必要だったのだが、そこで同じものを経験してた。

こういう実質の差分だけだと、ここに至るまでにどれだけ時間を費やしてしまったのかって、こうやって伝えない限りは伝わらんよなぁと思う。



Related Posts