- 投稿日:2021-01-08T23:01:55+09:00
Ruby on Rails 日本語でフォーム投稿した際にIncorrect string valueエラー解決方法
はじめに
環境
- Docker
- ruby 2.3.7
- Rails 5.2.4.4
- MySQL 5.7.32
エラー内容
新規投稿フォームに日本語を入力し、送信するとIncorrect string valueエラーが発生。
原因
Incorrect string valueのエラー文から、フォームに入力した文字列が原因と推測。
試しに英語を入力して送信すると問題なく投稿できました。ということは、DBが日本語に対応していない?
MySQLに接続し、使用中のデータベースの設定を確認。
mysql> show variables like '%char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)DBの文字コードの設定がutf8ではなく、latin1になっていました。
latin1は、西ヨーロッパ言語で日本語対応していないらしいです。Docker環境構築時にdatabase.ymlファイルの文字コードの設定が抜けていたのが原因でした。
database.ymldefault: &default adapter: mysql2 # ここに「charset: utf8」が抜けてたのが原因 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: hideki1104 host: db解決方法
etc/mysql/my.cnfのファイルに
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_bin skip-character-set-client-handshake [mysqldump] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4を記述すると文字コードが変更できます。
viエディタを使用して記述を追加しようとしたが、viコマンドが設定されておらず使えない
# vi my.cnf /bin/sh: 5: vi: not foundapt_getを使用すればvimをインストールできるらしい。
# apt-get -v apt 1.8.2.2 (amd64)下記のコマンドで一旦アップデートを行い
# apt-get updatevimをインストールします。
# apt-get install vimこれでvimを使用できるようになりました。
etc/mysql/my.cnfに先ほどの
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_bin skip-character-set-client-handshake [mysqldump] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4を記述することで文字コードを変更できました。
この状態ではすでに作成しているすでにDB、テーブル、カラムの文字カードは変更されていません。
MySQLの中で以下のコマンドを打ち込みました
DBの文字コード設定ALTER DATABASE DB名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;テーブルの文字コード設定
ALTER TABLE テーブル名 CONVERT TO character SET utf8mb4 COLLATE utf8mb4_unicode_ci;カラムの文字コード設定
ALTER TABLE テーブル名 CHANGE column_name カラム名 VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;これで投稿フォームで日本語を送信することができるようになりました。
参考記事
- 投稿日:2021-01-08T19:34:38+09:00
備忘録
- 投稿日:2021-01-08T19:34:38+09:00
AWS,Dockerによるインフラ構築練習 備忘録
- 投稿日:2021-01-08T19:19:18+09:00
自分的"よく使うけど覚えられない"Dockerコマンドまとめ
よく使うけどなぜかすぐ忘れる(個人的見解)dockerコマンドのコピペ用記録です。
ポートを指定してコンテナ起動
iは標準入力、tはtty割り当て、dはバックグラウンド実行のオプション
docker run -it --name <コンテナ名> -d -p 80:80 <イメージ名>コンテナのIPアドレスを取得
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <コンテナ名>コンテナの状態を確認
9割方コンテナのボリュームマウント状態を見るために使うけど、それならきっとマウントのみ確認するオプションがあるんだろうな。(調べるの面倒でgrepしてる)
docker inspect <コンテナ名>コンテナ一括削除
$()の中身を変更して代用もでき便利(なのにすぐ忘れる)
docker rm $(docker ps -aq)今あるコンテナのイメージ化
コンテナ起動を失敗した時の切り分けに役立つ。
docker commit <コンテナID> <任意のイメージ名>
- 投稿日:2021-01-08T16:46:33+09:00
Docker コンテナ内で composer install/require したら `Could not find package` となった
起こったこと
個人作成のアプリを作成中 docker のコンテナ内に入って、
composer require laravel/laravel
を実行したら以下のメッセージが出てきた。[InvalidArgumentException] Could not find package laravel/laravel with stability stable.
ちなみにローカルからだとうまくいく。
なんでやねーーーん!!紆余曲折を経て最終的にやったこと
Dockerfile から composer をインストールしている以下の記述を削除
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer RUN composer config -g repos.packagist composer https://packagist.jpマルチステージビルドを使用して composer を install する
COPY --from=composer:2.0.8 /usr/bin/composer /usr/bin/composer終わったら docker image を ビルドして完了
- 投稿日:2021-01-08T16:46:33+09:00
Docker コンテナ内で composer install/require で `Could not find package` となった
起こったこと
個人作成のアプリを作成中 docker のコンテナ内に入って、
composer require laravel/laravel
を実行したら以下のメッセージが出てきた。[InvalidArgumentException] Could not find package laravel/laravel with stability stable.
ファッ!?
やったこと
Dockerfile から composer をインストールしている以下の記述を削除
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer RUN composer config -g repos.packagist composer https://packagist.jpマルチステージビルドを使用して composer を install する
COPY --from=composer:2.0.8 /usr/bin/composer /usr/bin/composer終わったら docker image を ビルドして完了
- 投稿日:2021-01-08T16:00:04+09:00
Elixirアプリケーションのコンテナをできるだけダイエットした話
概要
Elixirで書いたchatops用アプリケーション
anago
をGKEで動かそうとdocker buildしたらかなり重めのRails並の容量になってしまったのでどこまでそぎ落とせるか検証した話です。FROM elixir:latest WORKDIR /app ENV MIX_ENV=prod RUN mix local.hex --force && \ mix local.rebar --force COPY mix.exs mix.exs COPY mix.lock mix.lock COPY config config RUN mix deps.get --only prod && \ mix deps.compile COPY . . CMD ["mix", "run", "--no-halt"]最初の頃のDockerfileはこんな感じです。
このDockerfileでビルドしたアプリケーションのサイズは下記の通り...docker images ## REPOSITORY TAG IMAGE ID CREATED SIZE anago latest aa7e0779d912 2 seconds ago 1.27GB画像もJSONもDBもない簡単なアプリケーションでのサイズが1.27GBと出てきたらさすがにダイエットを決意するよね...
ベースイメージの確認
Elixirのベースイメージサイズは下記の通り。
docker pull elixir ## docker images REPOSITORY TAG IMAGE ID CREATED SIZE elixir latest 83478b936eba 2 days ago 1.24GB
比較にGo言語のコンテナを取得してみると...
docker pull golang ### docker images REPOSITORY TAG IMAGE ID CREATED SIZE golang latest 5f9d35ce5cfe 3 weeks ago 839MB
やっぱりファイルサイズはビルドしたライブラリのコード含めても30MB程度。
だけどベースイメージがそもそも1.24GBもある...
比較に取ったGoのイメージと比べても300MB近くElixirのほうが重たいalpineにしてみる
イメージサイズのダイエットの入り口はベースイメージをalpineにすることだと思うのでベースイメージを変えてみる。
docker pull elixir:alpine ## docker images REPOSITORY TAG IMAGE ID CREATED SIZE elixir alpine dd10458addd0 2 days ago 84.9MB
圧倒的シェイプ!96%減!
これにアプリケーションの30MBを追加しても114MBに!REPOSITORY TAG IMAGE ID CREATED SIZE anago alpine c8b8c08b7aef About a minute ago 114MBもともとのサイズと比較すると10%未満にダイエット成功!!
もうこれで良いんじゃない?escript、動きます
Erlangにはアプリケーションを一つの実行ファイルに固めるescriptという仕組みがあります。
実行ファイルはErlangのランタイムがある環境でなら実行可能だったりします。
ということはErlang:alpineのイメージで動くんじゃない?
さっそくErlang:alpineのベースイメージを手に入れます。docker pull erlang:alpine ## docker images REPOSITORY TAG IMAGE ID CREATED SIZE erlang alpine daa6bbdd7458 2 weeks ago 69.4MB
ElixirはErlang上で動くためErlangのベースイメージのほうが軽量だったりします。
15MB程度ですが軽量ですね。
これで行きましょう!!ということでDockerfileに
mix escript build
を追加。
ついでにソースコードも要らないのでマルチステージビルドもやりましょう。FROM elixir:alpine as build WORKDIR /app ENV MIX_ENV=prod RUN mix local.hex --force && \ mix local.rebar --force COPY mix.exs mix.exs COPY mix.lock mix.lock COPY config config RUN mix deps.get --only prod && \ mix deps.compile COPY . . RUN mix escript.build FROM erlang:alpine WORKDIR /app COPY --from=build /app/anago /app/anagoこれでヨシ!
あらためでdocker build
してサイズを見てみるとREPOSITORY TAG IMAGE ID CREATED SIZE anago erlang_alpine a01f810d11dc 2 seconds ago 71.4MB71.4MBまで軽量化に成功!!!
ついに100MBの壁を突破しましたよ!!
閑話休題
このアプリケーションはもともと
mix run --no-halt
で動かすつもりだったのですがescriptにしたら即終了されてしまいます。
そういう時はtimer.sleep(:infinity)
と書いておくとずっと動いてたりします。defmodule Anago.CLI do def main(_args) do :timer.sleep(:infinity) end end
どこまで減らせる?
erlang:alpineだって最低限何らか一緒に入っているだろうとは思うのでalpineに
apk add erlang
してどこまで減るのか気になってきました。
バニラalpineのサイズはわずかに5MBです。
試しにalpineにerlangだけインストールするDockerfileを作ってみます。FROM alpine:latest RUN apk add --no-cache erlangこのDockerfileをビルドすると結果は 63.6MBまで軽量化されます!(Erlangが58MBくらいの容量になるのでこれ以上のダイエットは無理)
ここまで減らしちゃうとちゃんと動くのかが不安になりますがここまで来たら目標もどこまでサイズを削ぎおとせるかにシフトしているのでアプリケーションを含めてビルドしてみます。REPOSITORY TAG IMAGE ID CREATED SIZE anago custom_alpine fb1de28697a1 9 minutes ago 65.6MB65.6MBまで来ました
あとがき
ちなみにこのイメージもちゃんと実行できました(すごい...)
Erlangのサイズの限界でおそらくこれ以上の軽量化はできないと思うんで軽量化の限界は63.6MB + escriptとなるようです。
- 投稿日:2021-01-08T15:27:04+09:00
dockerのmount volumeのpermissionをfixuidでなんとかする
fixuidというコマンドを使う方法を知ったので共有します。
問題
docker/docker-composeでhostからvolumeをマウントして、そこへファイルを吐き出すと、rootで吐き出されてしまう。
あるいは、コンテナ内で作ったユーザーに対応するユーザーがhost側にいない
あるいは、host側のユーザーのUID/GIDを指定してdocker runしても、今度は当該ユーザーがコンテナ内にいない。問題の根源
docker buildした時とdocker runする時で同じシステムとは限らない
なので、userのid、groupのidが異なってしまう。対処
概ねこのような感じです
make_env.sh#!/bin/sh # 適切な.envを作成できればこれを使わなくてもよい touch .env echo "UID=$(id -u $USER)" >> .env echo "GID=$(id -g $USER)" >> .env echo "UNAME=$USER" >> .env... RUN useradd hoge # ユーザー名は各自かっこいいのつけて RUN USER=hoge && \ GROUP=hoge && \ curl -SsL https://github.com/boxboat/fixuid/releases/download/v0.5/fixuid-0.5-linux-amd64.tar.gz | tar -C /usr/local/bin -xzf - && \ chmod 4755 /usr/local/bin/fixuid && \ mkdir -p /etc/fixuid && \ printf "user: $USER\ngroup: $GROUP\n" > /etc/fixuid/config.yml # ここまでrootユーザー # ここからhogeユーザー USER hoge:hoge ENTRYPOINT[ "fixuid" ] # 他にもENTRYPOINTを使っている何かが有ればunshift的につければいい # ENTRYPOINT[ "fixuid", "docker-php-entrypoint" ] 等docker-compose.ymlhoge: image: php:latest user: "${UID}:${GID}" # <= .envから読みこまれる volumes: - ....使い方
# 各自、使う人が初回に叩いて.envを生成する ./make_env.sh # あとは普通に使える docker-compose up -d原理
- Dockerfileのベストプラクティスに則ってbuild時にuserを作っておく。この時点では、UID/GIDはランタイムと一致する保証はない。
- LinuxのユーザーのUID/GIDは書き換えることが出来る。fixuidはそれを実施した上で、渡したコマンドを実行してくれる
- 4xxxパーミッションが付いた実行ファイルは、その実行ファイルのownerの権限で動作する。fixuidはコレを利用してsudoなしでuid変更を実現する
- 他にも$HOMEの書き換えなどやってくれる様子
- docker run時に、host側ユーザーのuid/gidを外部から与えることで、ファイルシステムに記録されるuid/gidをhost-guestで一致させる
- 与える手段としては.envを使う。docker-composeは.envを読んでくれる
- uid/gidはidコマンドで取得
- uid/gidが一致しているので、hostからもguestからもちゃんと読める!
参考:
- https://github.com/boxboat/fixuid
- https://boxboat.com/2017/07/25/fixuid-change-docker-container-uid-gid/
- https://qiita.com/yohm/items/047b2e68d008ebb0f001#%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8F%E6%96%B9%E6%B3%951--entrypoint%E3%81%A7useradd%E3%81%A7%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E4%BD%9C%E3%82%8B
- https://qiita.com/cheekykorkind/items/ba912b62d1f59ea1b41e#setdotenvsh
- https://qiita.com/cheekykorkind/items/ba912b62d1f59ea1b41e#envsetdotenvsh%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%89%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F
- https://qiita.com/hikaruna/items/e04371fd49da0338ad81
- https://qiita.com/cognitom/items/6d8af8a71552ec9c6212#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E6%A8%A9%E9%99%90--fixuid-
- 投稿日:2021-01-08T15:14:39+09:00
サービスの公式ロゴ一覧
ドキュメントを作成する時にサービスのロゴなどを使いたいと思う時がよくあると思いますが、そういう時はきちんと公式のガイドラインに従って使用するようにしましょう。
※今後も順次、追記していきますGitHub
みなさんご存知ソースコード管理サービスです。
GitHub Logos and Usage
https://github.com/logosCircleCI
商標使用ガイドライン
https://circleci.com/ja/legal/trademark-guidelines/Blandfolder CircleCI
https://brandfolder.com/circlecidocker
コンテナの有名OSSです。
Docker Logos
https://www.docker.com/company/newsroom/media-resourcesArgoCD
継続的デリバリー(CD)ツールです。
CNCF Argo
https://cncf-branding.netlify.app/projects/argo/slack
コミュニケーションツールslackです。
- 投稿日:2021-01-08T02:04:51+09:00
python&jupyterlabのコンテナ構築
はじめに
Jupyterlabを使いPython環境を利用するコンテナを構築したので、その時の手順をメモとして残しておく。
実行環境
【Docker導入環境】
・Ubuntu 18.04 LTS(GCP上)
・docker 19.03.13手順
1.環境準備
2.Pythonコンテナを構築
3.SSHサーバー機能を追加
4.JuypterlabとSSHの同時起動1.環境準備
GCP上にVMインスタンスを作成
dockerのインストール
【Dockerコンテナ内のUbuntuではsystemctlは使えない】の手順1を参考に。2.コンテナ構築
ベースイメージを取得
$ docker image pull python:3
コンテナを作成
$ docker container run -it -d --name python-con1 python:3起動中コンテナの中に入り、いくつかのパッケージをインストール
$ docker container exec -it python-con1 /bin/bashコンテナ内で実行するコマンド# パッケージをインストール pip install numpy pandas jupyterlab # コンテナから出る exit変更後のコンテナイメージを作成
# コンテナの停止 $ docker container stop python-con1 # 現在のコンテナをイメージ化 $ docker container commit python-con1 python-img:ver1イメージが作成できている事を確認
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE python-img ver1 34ad01ba7efb 41 seconds ago 1.19GB python 3 d1eef6fb8dbe 2 weeks ago 885MB作成したイメージから再度コンテナを作成する。
※その際に、ポートマッピングやホスト側のディレクトリをマウント$ docker container run -it -d \ -p 8888:8888 \ #-v --name python-con2 python-img:ver1 # jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=""コンテナに入りJuypterlabを起動。
※上記のコンテナ作成のタイミングで起動しても良い。(コメントアウト部分)$ docker container exec -it python-con2 /bin/bashコンテナ内で実行するコマンドjupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=""この状態でホスト側の8888番ポートにアクセスして、juypterlabが開かれれば問題なし。
※ホスト側の8888番ポートは開放しておく。
ここまで確認できたら、コンテナは一旦削除。3.SSHサーバー機能を追加
各コンテナに対して直接操作を行える様にするためにSSHサーバーもインストールし、SSH接続ができる状態にしておく。
# コンテナ作成 $ docker container run -it -d --name python-con2 python-img:ver1 # コンテナに入る $ docker container exec -it python-con2 /bin/bashコンテナ内で実行するコマンドapt update apt install -y openssh-server apt install nanoサービスの起動に必要なフォルダを作成、共通鍵の登録
※鍵の生成はTera Term
などでしておく。今回はrootユーザーでアクセスする想定。コンテナ内で実行するコマンドmkdir /var/run/sshd mkdir /root/.ssh/ nano /root/.ssh/authorized_keys # 鍵の中身は公開鍵の[.pub]ファイルの中身をコピー変更後のコンテナイメージを作成
# コンテナの停止 $ docker container stop python-con2 # 現在のコンテナをイメージ化 $ docker container commit python-con2 python-img:ver2イメージが作成できている事を確認
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE python-img ver1 34ad01ba7efb 41 seconds ago 1.19GB python 3 d1eef6fb8dbe 2 weeks ago 885MB作成したイメージから再度コンテナを作成する。
※その際に、ポートマッピングやホスト側のディレクトリをマウント$ docker container run -it -d \ -p 8888:8888 \ -p 20022:22 \ --name python-con3 python-img:ver2 \ /usr/sbin/sshd -Dこの状態で、ローカルPCの
Tera Term
などからdockerホストの20022ポートにSSH接続できれば正常に動いている。
※ホスト側のポートを開放しておくこと。4.JuypterlabとSSHの同時起動
JuypterLabとSSHサーバが立ち上がるshファイルを作成しておき、コンテナ作成時の
CMD
上書き命令で、そのshファイルを実行する事でコンテナの再起動時に毎回自動でサービスが立ち上げる様にしたかったが、上手くいかなかった。
原因はshファイル自体が実行完了するとコンテナが落ちてしまうため。無限ループする様なshファイルも試してみたが、結局うまく行かなかったので別の方法で実施することにした。まずは下記のコマンドでコンテナを作成し、コンテナ起動のタイミングでSSHサービスが立ち上がる様にしておく。
docker container run -it -d \ -p 8888:8888 \ -p 20022:22 \ --name 【任意のコンテナ名】 python-img:ver2 \ /usr/sbin/sshd -Dそして、その後SSH接続して以下のコマンドを実施する。
jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=""※別ブラウザで立ち上げたコンソールからコンテナに入って上記のコマンドを実行しても良いが、個人的には上記のやり方の方が一手間少ないと思う。
- 投稿日:2021-01-08T01:21:12+09:00
docker registryにクライアントPCからhttpでアクセス
環境
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.1 LTS Release: 20.04 Codename: focal$ docker -v Docker version 20.10.1, build 831ebea手順
/etc/docker/daemon.jsonを作成、registryを指定
daemon.json{ "insecure-registries": [ "192.168.1.1:5000" ] }docker再起動
$ sudo systemctl daemon-reload $ sudo systemctl restart dockerちょっと躓いた
内容
/etc/docker/daemon.jsonにinsercure-registriesを記載しても反映されない
解決
daemon.json「"」と「:」の間にスペースがあったため
# OK { "insecure-registries": [ "192.168.1.1:5000" ] } # NG { "insecure-registries" : [ "192.168.1.1:5000" ] }その他
一度設定できてしまえば、空白があっても反映できるようになった
参考
- 投稿日:2021-01-08T00:41:49+09:00
Dockerfile, docker-composeの書き方と解説
はじめに
docker初心者の自分が同じようにdocker初心者の方向けに作成したものです。
Dockerfileやdocker-composeでよく使われている用語を抜粋してこの記事を書かせていただきました。皆さんの参考になれば幸いです。✊対象者
- Docker, docker-compose 初心者の方
- ファイルの書き方を忘れてしまった方
Dockerfile とは
Dockerfile は、命令を取り込み自動的にイメージをビルドしてくれるテキストファイルである。pull しなくても自分で Dockerfile を書けば好きなようにイメージを作成することができる。
Dockerfile よく使われる命令解説(例付き)
FROM で Docker イメージを指定(ローカルにイメージがなくても勝手に作成する)
FROM python:3.7ENV で 環境変数(key, value)を設定する
ENV PYTHONUNBUFFERED 1RUN で イメージ作成前にシェルを実行する
RUN mkdir /codeCMD で イメージ作成後にシェルを実行、複数用いても最後の 1 つだけ実行する
CMD python3 app.pyWORKDIR で docker コンテナ がコマンドを開始するディレクトリを指定
WORKDIR /usr/share/nginx/htmlCOPY で ホストからファイルを Docker イメージにコピー、圧縮ファイルの場合解凍されない
# /~/で囲うと絶対パス、無いとWORKDIRの相対パス COPY index.html index.htmlADD で ホストからファイルを Docker イメージにコピー、圧縮ファイルの場合解凍される
# /~/で囲うと絶対パス、ないとWORKDIRの相対パス ADD requirements.txt /code/VOLUME でホスト側のデータをマウントするディレクトリを指定
VOLUME /code
docker-compose とは
docker-compose は、YAML ファイルを使って複数のコンテナを定義し実行する Docker アプリケーションのためのツール。
docker-compose 解説(例付き)
サンプル
version: '3' services: db: image: postgres container_name: docker_compose_postgres ports: - "5555" environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres networks: - docker_link web: build: . command: python3 manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - db networks: - docker_link networks: docker_link:
- version:docker-compose のバージョン
- service:動かすアプリケーション
- image:Docker イメージ指定
- container_name:コンテナ名
- ports:ホスト側とコンテナ側の両方のポートを指定だけでなく公開用のみも指定できる
- environment:環境変数を追加
- build:Dockerfile の存在するディレクトリを指定
- command:デフォルトのコマンドを上書き
- volumes:ホストのディレクトリをマウントするディレクトリを指定
- depends_on:サービス間の依存関係を指定
- networks:どのネットワークに接続するかを指定
- networks:ネットワークの指定
参考にしたサイト
- 投稿日:2021-01-08T00:08:55+09:00
DockerでPython(Django)学習環境を作ってVSCodeでデバッグできるようにする(ほぼ自分用手順メモ)
この記事について
タイトルの通りです。
Djangoの勉強をするにあたって学習環境を構築したので、その手順メモをここに残します。
解説は一切ないので、どういうツールが入ってるとかどういう仕組みで動いてるとか一切興味ない、あるいはもう知ってるから環境構築だけさせてくれ!という人向けの記事です。
というか自分の備忘録的メモです。
Windows10環境にて実行しています。やりたいこと
- Djangoの勉強をしたい
- VSCodeでデバッガを使ってステップ実行とかもしたい
- Python仮想環境がどうとかで煩わしい思いをしたくない、PCの環境汚したくない
⇒Dockerで環境作ればいいよね!
WSL2をセットアップする
WSL2(Windows Subsystem for Linux 2)が未セットアップの場合、まずはWSL2をセットアップします。手順は下記です。
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10使用するLinuxディストリビューションはどれでもいいです。
私はUbuntuにしました。Docker Desktopをインストールする
Docker Desktopをインストールします。
https://www.docker.com/products/docker-desktop
インストーラーに従ってデフォルトのままインストールすれば問題ありません。VSCodeをインストールする
VSCodeをダウンロードしてインストールします。
https://azure.microsoft.com/ja-jp/products/visual-studio-code/続けて、Remote Containersという拡張をインストールします。
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers開発環境ファイルを取得する
本来であればここからDockerfileを書いたりVSCodeの設定ファイルを作ったりゴニョゴニョするのですが、学習用の環境ファイル一式を作成したので、下記から取得してください。
https://github.com/nendo-code/djangostudyenvDjangoの起動、デバッグ
VSCodeで、先ほど取得した「djangostudyenv」のフォルダを開きます
VSCodeの画面左下にある、緑色のアイコンを押します。
コマンドパレットが表示されるので、「Remote-Containers:Open Folder in Container」を選択します。
フォルダ選択するダイアログが出るので、先ほど取得した「djangostudyenv」のフォルダを指定します。
Dockerによる環境構築(と、VSCodeの拡張のインストール)が始まります。
「Starting Dev Container(show log)」をクリックすると、環境構築の進捗状況が表示されます。
これでDockerコンテナ上にDjangoの開発環境が構築できたので、Djangoのプロジェクトを作成します。
ターミナルを開いて下記のコマンドを実行します。$ cd /code/web $ django-admin startproject appこれで「app」というdjangoのプロジェクトが作成されます。
VSCodeの左側の「実行」メニューで「Python: Django」を選択して、デバッグの開始ボタンを押下します。
これでdjangoで作成したアプリケーションが起動するので、試しに
http://localhost:8000/
にアクセスします。
下記の通りdjangoのスタートページが表示されれば成功です。
これで環境構築は完了です。
あとはブレークポイントをコード上に置いて止めたり、ステップ実行したり、デバッガを使って開発できます。
カスタマイズ
環境をカスタマイズしたい場合は下記の箇所を修正するとカスタマイズできます。
・コンテナ側にVSCodeの拡張機能を入れたい
⇒
.devcontainer/devcontainer.jsonの"extensions"に、入れたい拡張を追加する。・djangoのプロジェクトフォルダの名称を変えたい、実行時のオプションを変えたい
⇒
.vscode/launch.jsonのconfigrationsを編集する。参考記事
https://docs.docker.jp/compose/django.html
https://docs.djangoproject.com/ja/3.1/intro/tutorial01/
https://qiita.com/nokonoko_1203/items/33a05c86f359027afb33
https://qiita.com/firedfly/items/00c34018581c6cec9b84