DockerコンテナからDockerイメージをつくる

昨日は Docker Hub から取ってきた CentOS のイメージをもとにしてコンテナを起動し、Tomcat をインストールして動かしてみた。

今日は、そのコンテナから Tomcat インストール済みのイメージを作ってみる。

現状確認

まずは現状の確認。イメージから。

[email protected] $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   b5b4d78bc90c        39 hours ago        203MB

centos という名前のイメージがある。これは昨日 Docker Hub から取ってきたもの。

[email protected] $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
2a1533db2a0e        centos:7            "/bin/bash"         31 hours ago        Exited (137) 31 hours ago                       tomcat

コンテナは tomcat という名前で残っている(停止中)。これは centos イメージから作ったものだ。

コンテナからイメージを作る

コンテナからイメージを作るには docker commit コマンドを使う。今回は tomcat コンテナから tomcat-image という名前のイメージを作った。

[email protected] $ sudo docker commit tomcat tomcat-image

イメージのリストを見ると、いま作ったイメージの名前が見える。

[email protected] $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat-image        latest              fa94a527ab79        24 seconds ago      488MB
centos              7                   b5b4d78bc90c        39 hours ago        203MB

作ったイメージから新しいコンテナを起動

それじゃ、作ったばかりの tomcat-image からコンテナを起動してみよう。その前にログ用のディレクトリを作っておく。

[email protected] $ sudo mkdir /var/log/tomcat-container2

で、コンテナ起動。コンテナ名は昨日のと被らないように tomcat2 とした。ホスト側のポートも 18082 にした。

[email protected] $ sudo docker run -it -d -p 18082:8080 -v /var/log/tomcat-container2:/share/logs --name tomcat2 tomcat-image

コンテナの確認。起動した tomcat2 という名前のコンテナがあり、元になったイメージが tomcat-image であることがわかる。

[email protected] $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS                     NAMES
e2735abcaf58        tomcat-image        "/bin/bash"         28 seconds ago      Up 26 seconds               0.0.0.0:18082->8080/tcp   tomcat2
2a1533db2a0e        centos:7            "/bin/bash"         31 hours ago        Exited (137) 31 hours ago                             tomcat

コンテナの中に入って Tomcat を起動。

[email protected] $ sudo docker exec -it tomcat2 bash
[[email protected] /]# cd /opt/apache-tomcat-9.0.34
[[email protected] apache-tomcat-9.0.34]# ./bin/startup.sh

ホスト側のブラウザで localhost:18082 にアクセスすると、ちゃんと Tomcat が動いているのが確認できた。

今日はここまで。

カテゴリー: Misc | コメントする

DockerコンテナでTomcatを動かしてみる

Tomcat を題材にして、Docker コンテナとのやり取りを試してみる。つぎのページを参考にした。

CentOS 7 のイメージを取ってきてコンテナを起動

Docker Hub から CentOS7 のイメージを取ってくる。

[email protected] $ sudo docker pull centos:7

後で使うので /var/log/tomcat-container ディレクトリを作っておく。

[email protected] $ sudo mkdir /var/log/tomcat-container

コンテナを起動。-v オプションは、ホストとコンテナのディレクトリ共有のオプション(後述)。

[email protected] $ sudo docker run -it -d -p 18080:8080 -v /var/log/tomcat-container:/share/logs --name tomcat centos:7

これで CentOS のコンテナが起動した。っていうか、Ubuntu 上で CentoOS のコンテナを動かせるんだね。

Tomcatをダウンロードしてコンテナ内にコピー

公式サイトから Apache Tomcat をダウンロード。

[email protected] $ wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz

ダウンロードしたファイルをコンテナ内にコピー。

[email protected] $ sudo docker cp apache-tomcat-9.0.34.tar.gz tomcat:/opt/

コンテナ内に入ってJavaとTomcatをインストール

起動中のコンテナの中に入るには、docker exec コマンド。シェルに bash を指定している。

[email protected] $ sudo docker exec -it tomcat bash

コンテナ内にて、まずは Java をインストール。

[[email protected] /]# yum install -y java

つづいて Tomcat のインストール。というか、これはアーカイブファイルを展開するだけ。で、Tomcat を起動する。

[[email protected] /]# cd /opt
[[email protected] opt]# ls
apache-tomcat-9.0.34.tar.gz
[[email protected] opt]# tar zxf apache-tomcat-9.0.34.tar.gz
[[email protected] opt]# cd apache-tomcat-9.0.34
[[email protected] apache-tomcat-9.0.34]# ./bin/startup.sh

これで OK。ホスト側のブラウザで http://localhost:18080/ にアクセスすると、ちゃんと Tomcat が動いているのが確認できた。

ホストとコンテナのディレクトリ共有

さて、Tomcat のログはコンテナの中にある。コンテナを停止したらログを見るためにはもう一度コンテナを起動する必要がある。さらに、コンテナを削除してしまったら、もうログを見る術はない。

ここで、ホストとコンテナのディレクトリ共有が生きてくる。docker run コマンドで指定した -v オプションだ。コンテナを起動するときに -v /var/log/tomcat-container:/share/logs と指定した。これでホストの /var/log/tomcat-container とコンテナの /share/logs が共有される。

いま、Tomcat のログファイルは、インストールしたディレクトリの下の logs ディレクトリに書きだされている(これが Tomcat のデフォルト)。そこでログファイルの出力先を /share/logs に変更する。

Tomcat をいったん停めて、設定ファイルを書き換えて、再起動。

[[email protected] apache-tomcat-9.0.34]# ./bin/shutdown.sh
[[email protected] apache-tomcat-9.0.34]# sed -i -e "s/\${catalina.base}\/logs/\/share\/logs/g" ./conf/logging.properties
[[email protected] apache-tomcat-9.0.34]# ./bin/startup.sh

これで、/share/logs ディレクトリにログファイルが出力されるようになった。

[[email protected] apache-tomcat-9.0.34]# ls -la /share/logs
total 20
drwxr-xr-x 2 root root 4096 May 6 05:04 .
drwxr-xr-x 3 root root 4096 May 6 04:59 ..
-rw-r----- 1 root root 5883 May 6 05:04 catalina.2020-05-06.log
-rw-r----- 1 root root    0 May 6 05:04 host-manager.2020-05-06.log
-rw-r----- 1 root root  408 May 6 05:04 localhost.2020-05-06.log
-rw-r----- 1 root root    0 May 6 05:04 manager.2020-05-06.log

ディレクトリ共有しているホストの /var/log/tomcat-container にも同じログファイルがあるのがわかる。

[email protected] $ ls -la /var/log/tomcat-container
合計 20
drwxr-xr-x  2 root root   4096 5月 6 14:04 .
drwxrwxr-x 14 root syslog 4096 5月 6 13:19 ..
-rw-r-----  1 root root   5883 5月 6 14:04 catalina.2020-05-06.log
-rw-r-----  1 root root      0 5月 6 14:04 host-manager.2020-05-06.log
-rw-r-----  1 root root    408 5月 6 14:04 localhost.2020-05-06.log
-rw-r-----  1 root root      0 5月 6 14:04 manager.2020-05-06.log

これらはコンテナを停止しても見ることができる。

[email protected] $ sudo docker stop tomcat
[email protected] $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
2a1533db2a0e        centos:7            "/bin/bash"         12 minutes ago      Exited (137) 9 seconds ago                       tomcat
[email protected] $ ls -la /var/log/tomcat-container
合計 20
drwxr-xr-x  2 root root   4096 5月 6 14:04 .
drwxrwxr-x 14 root syslog 4096 5月 6 13:19 ..
-rw-r-----  1 root root   5883 5月 6 14:04 catalina.2020-05-06.log
-rw-r-----  1 root root      0 5月 6 14:04 host-manager.2020-05-06.log
-rw-r-----  1 root root    408 5月 6 14:04 localhost.2020-05-06.log
-rw-r-----  1 root root      0 5月 6 14:04 manager.2020-05-06.log

とりあえずここまで。

カテゴリー: Misc | コメントする

Dockerコマンド(よく使いそうなもの)

状態の確認

コンテナの状態を確認。

[email protected] $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
8f048cac2336        hello-world         "/hello"            2 days ago          Exited (0) 2 days ago                       vigilant_varahamihira

一昨日のエントリで走らせた hello-world のコンテナが残っている。vigilant_varahamihira っていう名前になってるけど、これは Docker かテキトーにつけた名前だろう。

イメージの確認は docker image ls

[email protected] $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

docker iamges でも同じ結果が得られる。

[email protected] $ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

Dockerイメージの取得とコンテナの起動・停止

Docker Hub からイメージを取得して、コンテナ起動してみる。

イメージの取得は docker pull

[email protected] $ sudo docker pull nginx

これで nginx イメージの取得ができた。確認してみる。

[email protected] $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              602e111c06b6        11 days ago         127MB
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

コンテナの起動は docker run

[email protected] $ sudo docker run -d --name nginx-container -p 8181:80 nginx

オプションの意味はつぎの通り:

  • -d コンテナをバックグラウンドで起動
  • --name コンテナ名を指定
  • -p ホストとコンテナ間のポートフォワード設定。-p <ホスト側ポート>:<コンテナ側ポート>

コンテナの状態を確認すると、nginx-container という名前で起動している(STATUS が Up になっている)のがわかる。

[email protected] $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS                  NAMES
fc4887604124        nginx               "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes              0.0.0.0:8181->80/tcp nginx-container
8f048cac2336        hello-world         "/hello"                 2 days ago          Exited (0) 2 days ago                          vigilant_varahamihira

ブラウザで http://localhost:8181/ にアクセスすると Nginx のデフォルトページが表示された。

コンテナの停止は docker stop

[email protected] $ sudo docker stop nginx-container

コンテナの状態を確認すると、STATUS が Exited になっている。

[email protected] $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
fc4887604124        nginx               "nginx -g 'daemon of…"   8 minutes ago       Exited (0) About a minute ago                     nginx-container
8f048cac2336        hello-world         "/hello"                 2 days ago          Exited (0) 2 days ago                             vigilant_varahamihira

コンテナとイメージの削除

コンテナを削除するには docker container rm

[email protected] $ sudo docker container rm nginx-container

イメージを削除するには docker image rm

[email protected] $ sudo docker image rm nginx
[email protected] $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

nginx イメージが削除されている。

カテゴリー: Misc | コメントする

Ubuntu 16.04にDockerをインストール

公式サイトのドキュメントを参考にした。

下準備

まずは古いバージョンの Docker Engine をアンインストールせよ、とのことだけど、今回ははじめてインストールするのでこの作業はパス。

なので最初にするのは apt-get update

[email protected] $ sudo apt-get update

必要なパッケージをインストール。

[email protected] $ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

すでに全部インストールされていたようだ。

つぎに Docker 公式の GPG key をインストール。

[email protected] $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK

ちゃんとインストールできたか確認。

[email protected] $ sudo apt-key fingerprint 0EBFCD88
pub 4096R/0EBFCD88 2017-02-22
    フィンガー・プリント = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) [email protected]
sub 4096R/F273FCD8 2017-02-22

なんかドキュメントの例と出力が違うけど、日付とフィンガー・プリントが合ってるから大丈夫なんだろう。

リポジトリを登録。

[email protected] $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

途中に出てくる lsb_release -cs コマンドは Ubuntu ディストリビューションの名前を返す。↓こんな感じ。

[email protected] $ lsb_release -cs
xenial

Docker Engineのインストール

[email protected] $ sudo apt-get update
[email protected] $ sudo apt-get install docker-ce docker-ce-cli containerd.io

最後に hello-world イメージを走らせてみて、ちゃんとインストールできてるかを確認。

[email protected] $ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:8e3114318a995a1ee497790535e7b88365222a21771ae7e53687ad76563e8e76
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

大丈夫そうだ。

カテゴリー: Misc, Ubuntu | コメントする

WordPressサイトの引越し

このブログじゃなくて、もうひとつ別に運用しているサイト(ブログ)を引越した。

TL;DR

  • All-in-One WP Migration プラグインで簡単にエクスポート/インポート
  • インポートするファイルサイズが大きい時には All-in-One WP Migration File Extension プラグイン

引越し先のレンタルサーバ(さくらのレンタルサーバ)に WordPress を用意

まずは、引越し先のレンタルサーバにドメインを結びつけてから、WordPress をインストール。さくらのレンタルサーバでは、クイックインストールという機能が用意されているので簡単だ。

All-in-One WP Migration プラグインのインストール

引越し元・先の両方の WordPress に All-in-One WP Migration プラグインをインストールして有効化。

ついでに、引越し先には All-in-One WP Migration File Extension プラグインもインストールしておく。このプラグインはインポートできる最大ファイルサイズを大きくするもの。All-in-One WP Migration プラグインだけでは最大 5MB のところ、512MB になる。

インストールするには、https://import.wp-migration.com からプラグイン(zipファイル)をダウンロードして、WordPress の管理画面でファイルからインストールすればいい。

データ一式をエクスポート

引越し元の WordPress の管理画面左のメニューに「All-in-One WP Migration」があるので、「エクスポート」を選ぶ。細かいオプションもあるけど、今回は全てデフォルト。エクスポート先に「ファイル」を選んで少し待つとダウンロードできるようになるので、ダウンロードしておく。ファイルは .wpress という拡張子の独自形式のようだ。

ちなみに、今回ダウンロードしたファイルは 60MB あった。だから All-in-One WP Migration File Extension が必要なわけ。

引越し先にインポート

今度は引越し先の WordPress で、「All-in-One WP Migration」→「インポート」で上でダウンロードしたファイルを指定する。確認のダイアログが出て、「開始」をクリック。しばらくすると完了。

参考にしたページ

さいごに

いまのところ、引越し元のブログも残っていて、新しい方は別のドメイン名(サブドメイン)で動いている。しばらくはこのまま様子見。

引越し元のレンタルサーバは6月初めに契約が切れる(なにもしないと自動更新)ので、そのタイミングで完全に切り替えようかと思っている。

カテゴリー: Misc | コメントする

Python: Flask: HTTP GET メソッドのクエリパラメータに真偽値を使いたい

うまい例をでっち上げられないので、実際のユースケースで説明する。

自宅のサーバで Flask を使った書籍管理の web アプリを運用してるんだけど(ソースコードは GitHub で公開してある)、その web アプリには JSON を返す API が定義してある。で、API のひとつ /api/books/ は書籍情報の一覧を返し、クエリパラメータとして offset と limit を取ることができる。

Flask では request.args.get でクエリパラメータの値を取得するついでに、値の型とデフォルト値を指定することができる。↓こんな感じ。

@app.route('/api/books/')
def api_books():
    offset = request.args.get('offset', default=0, type=int)
    limit = request.args.get('limit', default=100, type=int)
    ....

さて、この書籍管理アプリには「書籍を削除する」という機能がなくて、かわりに書籍を捨てた時には、データベース上の disposed カラムに True をセットして、web アプリ上では表示しないようになっている。だけど上記の API ではそこのところを考慮してなかったので、返ってくる JSON には捨てた書籍も含まれている、という状況だった。

ここからが本題。

API の返す JSON に、デフォルトでは捨てた書籍(つまり disposed=True)は含まず、クエリで include_disposed に真値をセットした時にだけ含むようにしたい。

最初の方法

上に示したコートでは、クエリパラメータの値を int に変換して取得しているんだから、同様に bool を指定してやればいいと思った。こういうふうに。

@app.route('/api/books/')
def api_books():
    offset = request.args.get('offset', default=0, type=int)
    limit = request.args.get('limit', default=100, type=int)
    include_disposed = request.args.get('include_disposed', default=False, type=bool)
    ....

開発用のサーバはエラーもなく立ち上がり、/aip/books/ にアクセスすると捨てた書籍が含まれていない JSON が、/api/books/?include_disposed=True にアクセスすると捨てた書籍も含まれた JSON が返ってきた。期待通りだ。

ところが、試しに /api/books/?include_disposed=False にアクセスしてみると、捨てた書籍も含まれた JSON が返ってきた。これは期待する動作と違う。

原因は追求していないけど、想像するに、クエリの値として渡ってきた文字列を bool(文字列) してるだけなんじゃなかろうか。だとすると、クエリで include_disposed の値がなんであるかにかかわらず、空文字列でない限りは、変数 include_disposed の値は True になるわけだ。

なんてこった。期待させやがって!

解決編

しかたがないので文字列を真偽値に変換する関数を書いた。一般に真を表すであろう文字列(true、 yes、 on、大文字小文字を問わない)の時だけ True を返し、ほかは False を返す。

def str_to_bool(s):
    p = re.compile(r'(true|yes|on)\Z', re.IGNORECASE)
    if p.match(s):
        return True
    else:
        return False

で、クエリの値を変数に代入するところはこうした。

    include_disposed = str_to_bool(request.args.get('include_disposed', default=''))

request.args.get の返す値を str_to_bool で変換している。default=” を指定しているのは、指定しないとクエリに include_disposed がなかった時に None が返ってくるため。

さて、これで期待通りの動作をするようになった。

カテゴリー: Python | コメントする

CentOS 8: NginxでCGIを利用できるようにする

以前 Ubuntu ではやったけど、今度は CentOS で。

fcgiwrap のインストール

標準のリポジトリには無いようなので EPEL からインストール。

[[email protected] ~]$ sudo dnf -y install epel-release
[[email protected] ~]$ sudo dnf --enablerep=epel -y install fcgiwrap

Nginx の設定

CGI を利用したいサイトの設定ファイルの server セクションにつぎを追加。

location ~ \.cgi$ {
        root  /var/www/app;
        fastcgi_pass  unix:/var/run/fcgiwrap.socket;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        include  /etc/nginx/fastcgi_params;
}

で、Nginx をリスタート。

[[email protected] ~]$ sudo systemctl restart nginx

fcgiwrap 用の設定ファイルを作成して起動。

/usr/lib/systemd/system/fcgiwrap.service

[Unit]
Description=Simple CGI Server
After=nss-user-lookup.target
Requires=fcgiwrap.socket

[Service]
EnvironmentFile=/etc/sysconfig/fcgiwrap
ExecStart=/usr/sbin/fcgiwrap ${DAEMON_OPTS} -c ${DAEMON_PROCS}
User=ngix
Group=root

[Install]
Also=fcgiwrap.socket

/usr/lib/systemd/system/fcgiwrap.socket

[Unit]
Description=fcgiwrap socket

[Socket]
ListenStream=/run/fcgiwrap.socket

[Install]
WantedBy=sockets.target

起動。

[[email protected] system]$ sudo systemctl enable --now fcgiwrap

SELinux

SELinux を有効にしているので、ポリシーを作る。

nginx-server.te

module nginx-server 1.0;

require {
    type httpd_t;
    type var_run_t;
    class sock_file write;
}

#======== httpd_t ========
allow httpd_t var_run_t:sock_file write;
[[email protected] ~]$ sudo checkmodule -m -M -o nginx-server.mod nginx-server.te
[[email protected] ~]$ sudo semodule_package --outfile nginx-server.pp --module nginx-server.mod
[[email protected] ~]$ sudo semodule -i nginx-server.pp

CGI のテスト

設定したディレクトリ(今回は /var/www/app)の中に、hello.cgi を作成。

#!/usr/bin/env ruby

print "Content-type: text/html\n\n"
print <<EOC
<html>
  <body>
    <h1>Hello</h1>
    <p>Hello, from CGI!</p>
  </body>
</html>
EOC

実行権限をつけるのを忘れずに。

今回はスマホから確認した。OKだった。

カテゴリー: CentOS, Misc | コメントする

UbuntuでOneDriveをつかう

下準備

必要なパッケージをインストールする。

[email protected] $ sudo apt install libcurl4-openssl-dev libsqlite3-dev gdebi
[email protected] $ wget http://downloads.dlang.org/releases/2020/dmd_2.090.1-0_amd64.deb
[email protected] $ sudo gdebi dmd_2.090.1-0_amd64.deb

OneDrive Client のインストール

[email protected] $ git clone [email protected]:skilion/onedrive.git
[email protected] $ cd onedrive
[email protected] $ make
[email protected] $ sudo make install

設定ファイルのコピー

[email protected] $ mkdir -p ~/.config/onedrive
[email protected] $ cp ./config ~/.config/onedrive/config

デフォルトの設定ファイルはつぎのようになっている。

# Directory where the files will be synced
sync_dir = "~/OneDrive"
# Skip files and directories that match this pattern
skip_file = ".*|~*"

サービスの起動

[email protected] $ systemctl --user enable onedrive
[email protected] $ systemctl --user start onedrive

初回起動

サービスとして起動したら、onedrive コマンドを実行。

[email protected] $ onedrive

すると、端末にメッセージが表示される。「Authorize this app visiting:」につづいて URL が表示されるので、これをコピーしてブラウザでアクセスし、Microsoftアカウントにログインする。アプリから OneDrive へのアクセスを許可するかと聞かれるので「はい」を選択。新しい、空白のページが表示されるので、このページの URL をコピーして端末に戻り、「Enter the response uri:」のあとに貼り付けてエンター。これでファイルの同期が始まる。

自動起動の設定

ファイルの同期を続けるためには、onedrive コマンドを実行しておく必要があるらしい。Ubuntu にログインするときに自動的に実行するように設定する。

Alt+F2 キーを押してアクティビティ画面を表示し、「gnome-session-properties」を検索。出てきたアイコンをクリックすると「自動的に起動するプログラムの追加」ウィンドウが表示される。ここに onedrive -m コマンドを追加する。

参考ページ

 cf. UbuntuでOneDriveを使う – Qiita

カテゴリー: Misc, Ubuntu, Windows | コメントする

WordPressをやめて静的サイトジェネレータに乗り換えようかと考え始めた

きっかけは Qiita のこの記事を読んで。

 cf. 7年間使ってきたWordPressを捨ててContentful+Gatsby+Netlifyにしたら爆速になったし経緯とか教訓とか語る – Qiita

正直、Contentful も Gatsby も Netlify もどういうものかよく分かってないんだけど、WordPress に不満が溜まってきたからだ。

これ以上は後で書く。

カテゴリー: Misc | コメントする

UbuntuのNode.jsを最新にする

ここのところ JavaScript を書く機会があって、最近の書き方なんかを調べたりしてるんだけど、そういえば Ubuntu にインストールした Node.js はどうなってるんだっけかな、と思って確かめてみたら:

[email protected] $ node -v
v4.2.6

もはや、いつインストールしたのかもわからない古いバージョンだった。公式サイトによると、最新版が13.6.0、推奨版が12.14.1 LTS だ。

で、さて、バージョンアップはどうやったらいいのか。ググってみたら、n package というのを使うといいらしい。

 cf. Ubuntuに最新のNode.jsを難なくインストールする – Qiita

さっそくこの通りにやってみる。まずは npm で n package をインストール。

[email protected] $ sudo npm install n -g

その n package (nコマンド)を使って Node.js をインストール。

[email protected] $ sudo n stable

もとから入っていた古い Node.js を削除。

[email protected] $ sudo apt purge -y nodejs npm

そしてシェルを読みなおす。

[email protected] $ exec $SHELL -l

これで完了。最新になっているか、確かめてみよう。

[email protected] $ node -v
v12.14.1
[email protected] $ npm -v
6.13.4

Qiita の記事によると、複数バージョンの管理なんかもできるらしい。

カテゴリー: JavaScript, Ubuntu | コメントする