Dockerイメージを元にコンテナを立ち上げようと思ったら権限がないよーと怒られたのでメモ。
$ docker -v Docker version 19.03.12
実現したいこと
用意したDockerfileを元にイメージをbuildして、それを元にコンテナを立ち上げたい。
myimage ├── Dockerfile └── hello.sh
myimageコンテキストにDockerfileを配置し、その中でhello.shを呼び出しています。
myimage/Dockerfile
FROM ubuntu:20.04 COPY ./hello.sh /hello.sh ENTRYPOINT [ "/hello.sh" ]
ubuntuのイメージをpullしてきて、hello.sh
をDockcerコンテキスト内にコピーした上で呼び出し。
myimage/hello.sh
#!/bin/bash echo "Hello, World!" exec sleep infinity
「"Hello, World!"」とだけ表示するスクリプトを用意しています。
まずはイメージをbuild
myimageディレクトリにいる状態でイメージをbuildします
$ docker build -t myimage:v1 myimage Sending build context to Docker daemon 3.072kB Step 1/3 : FROM ubuntu:20.04 20.04: Pulling from library/ubuntu da7391352a9b: Pull complete 14428a6d4bcd: Pull complete 2c2d948710f2: Pull complete Digest: sha256:c95a8e48bf88e9849f3e0f723d9f49fa12c5a00cfc6e60d2bc99d87555295e4c Status: Downloaded newer image for ubuntu:20.04 ---> f643c72bc252 Step 2/3 : COPY ./hello.sh /hello.sh ---> da890eb1eb2a Step 3/3 : ENTRYPOINT [ "/hello.sh" ] ---> Running in 2b03c1169cde Removing intermediate container 2b03c1169cde ---> 7e5111487d28 Successfully built 7e5111487d28 Successfully tagged myimage:v1
無事成功。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimage v1 7e5111487d28 6 seconds ago 72.9MB
ちゃんとイメージがbuildされました。
コンテナを作成
buildしたイメージを元にコンテナを立ち上げます。
$ docker run --name mycontainer myimage:v1 docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"/hello.sh\": permission denied": unknown.
ここでエラー発生。
なんか権限がないよーと怒られている。
そうか、hello.sh
を作成した後権限を変更するのを忘れていた。
解決策:ファイル権限を変更する
hello.sh
はホスト側で作成したファイルなので、それをDockerコンテキストにコピーして開こうとしても権限がなくて実行できなかったっぽい。
$ chmod +x hello.sh
どのユーザーでも実行できるよう権限を変更した。
$ ls -ln total 16 -rw-r--r-- 1 502 20 71 1 11 19:06 Dockerfile -rwxr-xr-x 1 502 20 85 1 11 19:20 hello.sh
さっき一旦コンテナが出来上がってしまったので一度削除して、
$ docker rm mycontainer
これでいけるはず!
$ docker run --name mycontainer myimage:v1 docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"/hello.sh\": permission denied": unknown. ERRO[0000] error waiting for container: context canceled
あれっ、、。
なんかちょっとエラー内容変わってるけどまだ権限エラーっぽい。。
解決策2:権限を変えた後イメージをbuildし直す
もしかしてと思ってイメージをbuildしなおしたらいけた。
一旦イメージを削除
$ docker rmi イメージID
hello.sh
の権限はさっき変更したので、この状態で再build
$ docker build -t myimage:v1 myimage
そしてコンテナの起動
$ docker run --name mycontainer myimage:v1 Hello, World!
できた!
学び
- Dockerコンテキスト内のファイル権限を変更した後はイメージを再buildする必要がある
考えてみれば権限ごとCOPYしてるはずなので当たり前よね。。