概要
忘れないうちにここにメモメモ。。。
dockerで作業している場合で Dockerfile
を作らない、またはDockerfile内で明示的にユーザを作らない場合、基本的にrootユーザになります。
docker container run
で 直接 イメージ指定 して、コマンドを実行させたりする場合とかがそうですね。
例えば、以下のような Go のソースがあるとします。
package main import "fmt" func main() { fmt.Println("hello-go") }
ローカル環境には go が入っていません。
$ go version コマンド 'go' が見つかりません。次の方法でインストールできます: sudo apt install golang-go # version 2:1.16~0ubuntu1, or sudo apt install gccgo-go # version 2:1.16~0ubuntu1
コンパイルするために、dockerでコンテナ起動してその中でビルドするようにします。
docker container run \ --interactive \ --tty \ --rm \ --mount type=bind,src=${PWD},dst=/workspace \ --workdir /workspace \ mcr.microsoft.com/vscode/devcontainers/go:1.17 \ go build
実行するとビルドは行われますが、ユーザを見ると root ユーザになっています。
$ ls -l total 1740 -rw-rw-rw- 1 vscode vscode 27 Nov 24 05:28 go.mod -rw-rw-rw- 1 vscode vscode 69 Nov 24 05:28 main.go -rw-rw-rw- 1 vscode vscode 591 Nov 24 06:22 Makefile -rwxrwxrwx 1 root root 1766510 Nov 24 07:55 sample-app
ちゃんと動くのですが、これはちょっと困ります。Dockerホストのユーザと同じユーザIDで処理してほしい。
このようなときに、--user
オプションを使います。
先程の docker container run
に以下を追加します。
--user 1000:1000
1000 というのは私の環境での今使っているユーザのユーザIDです。
docker container run \ --interactive \ --tty \ --rm \ --user 1000:1000 \ --mount type=bind,src=${PWD},dst=/workspace \ --workdir /workspace \ --env GOCACHE=/workspace/.cache \ mcr.microsoft.com/vscode/devcontainers/go:1.17 \ go build
--env GOCACHE=/workspace/.cache
の部分は、一般ユーザの場合、Goのデフォルトのキャッシュディレクトリの場所を触ろうとするとパーミッションエラーが出るからです。
Dockerfileの中でディレクトリを作ったりしていれば大丈夫ですが、今は docker container run
でベースイメージを直指定してコマンド実行しているので、環境変数使って場所を変更しています。
んで、ビルドされたファイルを見てみると
$ ls -l total 1740 -rw-rw-rw- 1 vscode vscode 27 Nov 24 05:28 go.mod -rw-rw-rw- 1 vscode vscode 69 Nov 24 05:28 main.go -rw-rw-rw- 1 vscode vscode 591 Nov 24 06:22 Makefile -rwxrwxrwx 1 vscode vscode 1766510 Nov 24 08:01 sample-app
ちゃんと指定したユーザIDで生成されていますね。
Makefile
今回の件を試すための Makefile です。
UID = $(shell id -u) GID = ${UID} ARG = go build -o sample-app default: run-root: docker container run \ --interactive \ --tty \ --rm \ --mount type=bind,src=${PWD},dst=/workspace \ --workdir /workspace \ mcr.microsoft.com/vscode/devcontainers/go:1.17 \ ${ARG} ls -l run-nonroot: docker container run \ --interactive \ --tty \ --rm \ --user ${UID}:${GID} \ --mount type=bind,src=${PWD},dst=/workspace \ --workdir /workspace \ --env GOCACHE=/workspace/.cache \ mcr.microsoft.com/vscode/devcontainers/go:1.17 \ ${ARG} ls -l clean: sudo rm -f sample-app
以下のようにして実行できます。
$ make run-nonroot ARG="go build" $ make run-nonroot ARG="go run ."
ついでに、githubにもアップしてありますので、よければご参考までに。
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場