いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

docker container run でユーザIDとグループIDを指定する (docker container run, --user)

概要

f:id:gsf_zero1:20211029114204p:plain

忘れないうちにここにメモメモ。。。

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にもアップしてありますので、よければご参考までに。

github.com


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com