ほんとにひとつ前のまんま続き。
「とにかく一つ実際に動くものが実例としてあるといろいろ便利だろう(今後の雛形になるかも)と思って、一つ作ってみたのがこれ」のバージョン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」となり、ユーザをチェックするつもりが、先にデータベースの存在エラーを拾ってしまって、目的のチェックになっていないわけね。
ここまでのものでもまぁ初版としてはまぁまぁだとは思うのだけれど、やはり初期データ投入部分の柔軟性がないのが気になるので:
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 を使う場合は例えば:
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) を導入する」ということが必要になった。言葉だけで言えばこれはとても単純な話に見えるだろうけれど、「そういう古い環境を今同じ状態に再構築したくても、外的要因で実現しにくい」のはあるあるである。一番わかりやすい条件は、「ダウンロード先が消えてなくなってしまった」というようなこと。
変更点だけみればやっぱり大したことには見えない:
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 のインストールも必要だったのだが、そこで同じものを経験してた。
こういう実質の差分だけだと、ここに至るまでにどれだけ時間を費やしてしまったのかって、こうやって伝えない限りは伝わらんよなぁと思う。