こういうなんでもないプロジェクトがあったとする。
[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 がバリデーションしてくれる訳でもないし、さらにカレントディレクトリが暗黙に使われていると非常に気付きづらい。気をつけましょう。。