LoginSignup
3

More than 1 year has passed since last update.

dockerを使ってローカルにあるファイルを実行する

Last updated at Posted at 2021-03-06

dockerを最近勉強し始めたのでその備忘録
初心者向け記事にファイルの扱いがあまり記載されてないのでメモ
間違いやもっと簡素なやり方がありましたらご指摘ください!

やりたいこと

dockerのcontainerを使い、ローカルにあるpythonスクリプトを実行したい

docker_test.py
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

参照

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3