平常運転

アニソンが好き

過去記事とかは記事一覧で見れます

docker-compose で - や _ で始まるプロジェクト名を使ってはいけない

こういうなんでもないプロジェクトがあったとする。

[astj@gemmy01 /Users/astj/sandbox/myproject]$ cat Dockerfile
FROM debian:8
[astj@gemmy01 /Users/astj/sandbox/myproject]$ cat docker-compose.yml
version: "3"

services:
  debian:
    build:
      context: .
      dockerfile: Dockerfile
[astj@gemmy01 /Users/astj/sandbox/myproject]$ docker-compose build
Building debian
Step 1/1 : FROM debian:8
 ---> ce40fb3adcc6
Successfully built ce40fb3adcc6
Successfully tagged myproject_debian:latest

ここで docker-compose のプロジェクト名を - や _ で始まるものにすると、直感的じゃないエラーメッセージを吐いて失敗する。

[astj@gemmy01 /Users/astj/sandbox/myproject]$ docker-compose -p -myproject build
Building debian
ERROR: invalid reference format
[astj@gemmy01 /Users/astj/sandbox/myproject]$ docker-compose -p _myproject build
Building debian
ERROR: invalid reference format

verbose オプションをつけて辿ると、 Docker API から 500 が帰ってきていることが分かる。そうだよねという感じ。

[astj@gemmy01 /Users/astj/sandbox/myproject]$ docker-compose -p -myproject --verbose build
compose.config.config.find: Using configuration files: ./docker-compose.yml
docker.utils.config.find_config_file: Trying paths: ['/Users/astj/.docker/config.json', '/Users/astj/.dockercfg']
docker.utils.config.find_config_file: Found file at path: /Users/astj/.docker/config.json
docker.auth.load_config: Found 'auths' section
(snip)
docker.auth.load_config: Found 'credsStore' section
urllib3.connectionpool._make_request: http://localhost:None "GET /v1.25/version HTTP/1.1" 200 566
compose.cli.command.get_client: docker-compose version 1.21.1, build 5a3f1a3
docker-py version: 3.3.0
CPython version: 3.6.4
OpenSSL version: OpenSSL 1.0.2o  27 Mar 2018
compose.cli.command.get_client: Docker base_url: http+docker://localhost
compose.cli.command.get_client: Docker version: Platform={'Name': ''}, Components=[{'Name': 'Engine', 'Version': '18.03.1-ce', 'Details': {'ApiVersion': '1.37', 'Arch': 'amd64', 'BuildTime': '2018-04-26T07:22:38.000000000+00:00', 'Experimental': 'true', 'GitCommit': '9ee9f40', 'GoVersion': 'go1.9.5', 'KernelVersion': '4.9.87-linuxkit-aufs', 'MinAPIVersion': '1.12', 'Os': 'linux'}}], Version=18.03.1-ce, ApiVersion=1.37, MinAPIVersion=1.12, GitCommit=9ee9f40, GoVersion=go1.9.5, Os=linux, Arch=amd64, KernelVersion=4.9.87-linuxkit-aufs, Experimental=True, BuildTime=2018-04-26T07:22:38.000000000+00:00
compose.cli.verbose_proxy.proxy_callable: docker inspect_network <- ('myproject_default')
urllib3.connectionpool._make_request: http://localhost:None "GET /v1.25/networks/myproject_default HTTP/1.1" 404 50
compose.service.build: Building debian
compose.cli.verbose_proxy.proxy_callable: docker build <- (path='/Users/astj/sandbox/myproject', tag='-myproject_debian', rm=True, forcerm=False, pull=False, nocache=False, dockerfile='Dockerfile', cache_from=None, labels=None, buildargs={}, network_mode=None, target=None, shmsize=None, extra_hosts=None, container_limits={'memory': None}, gzip=False, isolation=None, platform=None)
docker.api.build._set_auth_headers: Looking for auth config
(snip)
urllib3.connectionpool._make_request: http://localhost:None "POST /v1.25/build?t=-myproject_debian&q=False&nocache=False&rm=True&forcerm=False&pull=False&dockerfile=Dockerfile HTTP/1.1" 500 39
compose.cli.verbose_proxy.proxy_callable: docker build -> <generator object APIClient._stream_helper at 0x1049ba570>
ERROR: compose.cli.errors.log_api_error: invalid reference format

明示的にこういうプロジェクト名をつけることはないと思うけど、 docker-compose のプロジェクト名のデフォルトはカレントディレクトリの basename から決まるので、例えばディレクトリ名が - で始まる場合も同じ状況になる。

[astj@gemmy01 /Users/astj/sandbox/-myproject]$ docker-compose build
Building debian
ERROR: invalid reference format

(逆に、この場合でも安全なプロジェクト名を明示的に渡せばきちんと動く。)

[astj@gemmy01 /Users/astj/sandbox/-myproject]$ docker-compose -p mymyproject build
Building debian
Step 1/1 : FROM debian:8
 ---> ce40fb3adcc6
Successfully built ce40fb3adcc6
Successfully tagged mymyproject_debian:latest

ディレクトリ名が - で始まることも普段そうそうないような気がするが、たとえば Jenkins ではビルドプロジェクトの名前に - が入っていると、 truncate された結果こういうディレクトリが出現することがある。。以下のディレクトリは、Hoge-Foobar プロジェクトの様子である。つまり今回ハマった実例……

drwxr-xr-x 14 jenkins jenkins 4096 Jun 14 00:22 -Foobar_better_dockerfile-7R67AOHUZ25GOP2ZOFPGO2JCU7R5KFETCWFFHQJGSXNWUUACIIAA

原因が分かってしまえば納得感があるのだけれど、エラーメッセージがわかりにくいし、 docker-compose がバリデーションしてくれる訳でもないし、さらにカレントディレクトリが暗黙に使われていると非常に気付きづらい。気をつけましょう。。