dockerを最近勉強し始めたのでその備忘録
初心者向け記事にファイルの扱いがあまり記載されてないのでメモ
間違いやもっと簡素なやり方がありましたらご指摘ください!
やりたいこと
dockerのcontainerを使い、ローカルにあるpythonスクリプトを実行したい
if __name__ = "__main__":
print("Success!")
手順
1:python imageをpullしてくる
$ docker pull python
2:containerを作成する
$docker container run -it python
Python 3.9.2 (default, Feb 19 2021, 17:11:58)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
run
する時に--name
オプションを付ければcontainerの名前を決めることができる(しない場合、適当な名前がつく)
-it
オプションはつけないとすぐにコンテナが停止してしまうので注意
その後、control+P+Qでdettachする。
control+dまたはexit
でもいいが、その場合、コンテナがstopしてしまうので、restartする
$docker container restart charming_mirzakhani
charming_mirzakhaniの部分はcontainer id もしくはcontainer name
container nameやcontainer idはdocker ps -a
で確認できる
$docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a55c7106a6c python "python3" About an hour ago Exited (0) 9 minutes ago charming_mirzakhani
3:(ローカルにある)実行したいファイルをcontainer内のフォルダにコピーする
$docker cp /path/to/docker_test.py charming_mirzakhani:/usr/local/src/
docker cp [ローカルファイルへのパス] [container name or id]:[container内のパス]
という構文
上の例ではcharming_mirzakhaniコンテナ内の/usr/local/src/ディレクトリにローカル(ホストOS)にあるdocker_test.pyをコピーしている
4−1:スクリプトを実行する
$docker container exec -w /usr/local/src/ charming_mirzakhani python docker_test.py
Success!
起動中のコンテナでの作業なので、exec
を使う
-w
オプションはcd
みたいなもので、実行時のカレントディレクトリを/usr/local/src/にする
4−2:bashを利用する方法
コンテナ内でbashに入ることもできる
$docker exec -it charming_mirzakhani bash
root@6a55c7106a6c:/#
この後はいつもローカルでやっているように実行できる
root@6a55c7106a6c:/# /usr/local/src/docker_test.py
Success!
バインド・マウントを使う方法
別の方法としてバインド・マウントがあります。
(正確な表現ではありませんが)これはローカルにあるディレクトリをcontainer内のディレクトリとして扱えるようにする方法です。
ファイルを更新しながら実行したい場合はこっちを使うのが便利です。
ローカル(ホストOS)側のディレクトリをcontainerにマウントする
$docker container run -v "$PWD":/usr/local/src -it python bash
root@7018bfa18828:/#
-v
オプションでマウントを指定する、[ホスト側のpath]:[container側のpath]
という構文
上の例では、ホスト側のカレントディレクトリをcontainerの/usr/local/src
にマウントしている
bashを使って確認してみると、
root@7018bfa18828:/# ls usr/local/src/
docker_test.py
root@7018bfa18828:/#
確かに、カレントディレクトリがマウントされている
なので後はこれを実行すれば良い
root@7018bfa18828:/# cd usr/local/src/
root@7018bfa18828:/usr/local/src# python docker_test.py
Success!
root@7018bfa18828:/usr/local/src#
マウントを先にしておけば、bashに入らなくてもcontainer起動時は以下のようにも実行できる
$ docker container exec 7018bfa18828 python /usr/local/src/docker_test.py