箱のプログラミング日記。

えんじにあ奮闘記

Dockerコンテナを立ち上げようとして「OCI runtime create failed」「" 〜 permission denied": unknown.」 と言われたとき

f:id:y_hakoiri:20191102121704j:plain

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してるはずなので当たり前よね。。

参考

chmod コマンド - Qiita

イラストでわかるDockerとKubernetes