Posted at

docker-composeコマンド実行時にTLSParameterErrorになった場合の対応

docker-compose ps 実行時にTLSParameterErrorエラーが発生し、解決をするために調べた内容のまとめです。


エラー内容

docker-compose ps 実行時に下記のエラーが発生しました。

Traceback (most recent call last):

File "docker-compose", line 6, in <module>
File "compose/cli/main.py", line 71, in main
File "compose/cli/main.py", line 124, in perform_command
File "compose/cli/command.py", line 39, in project_from_options
File "compose/cli/docker_client.py", line 84, in tls_config_from_options
File "site-packages/docker/tls.py", line 81, in __init__
docker.errors.TLSParameterError: Path to a certificate and key files must be provided through the client_config param. TLS configurations should map the Docker CLI client configurations. See https://docs.docker.com/engine/articles/https/ for API details.
[99424] Failed to execute script docker-compose


対応

エラーで検索をしたところ、下記のgithub issueが見つかりました。

docker-compose $(docker-machine config default) up Fails.


Try docker-compose $(docker-machine config default | xargs ) ps


とのことでしたので、実行したところ動くようになりました。

$ docker-compose $(docker-machine config default | xargs ) ps

ERROR: TLS configuration is invalid - make sure your DOCKER_TLS_VERIFY and DOCKER_CERT_PATH are set correctly.
You might need to run `eval "$(docker-machine env default)"`

$ eval "$(docker-machine env default)"

$ docker-compose $(docker-machine config default | xargs ) ps
Name Command State Ports
-----------------------------------------------------------------------------------------------
mysql docker-entrypoint.sh --inn Up 0.0.0.0:3306->3306/tcp,
... 33060/tcp
php-fpm docker-php-entrypoint php-fpm Up 9000/tcp
(一部省略)

その後 docker-compose ps で動くようになりました。

$ docker-compose ps

Name Command State Ports
-----------------------------------------------------------------------------------------------
mysql docker-entrypoint.sh --inn Up 0.0.0.0:3306->3306/tcp,
... 33060/tcp
php-fpm docker-php-entrypoint php-fpm Up 9000/tcp


evalコマンドとは?

そもそも実行したevalコマンドがわからなかったのですが、文字列をコマンドとして実行するためのコマンドだそうです。

【 eval 】コマンド――文字列を評価、連結して実行する


evalコマンドが威力を発揮する場面は2つあります。1つはあるコマンドが出力した文字列自体をコマンドとして実行すること、もう1つは(入れ子になった)変数を評価することです。


# コマンドとして実行されない

$ 'time'
# コマンドとして実行される
$ eval 'time'
shell 0.21s user 0.15s system 0% cpu 12:14.77 total
children 1.31s user 1.73s system 0% cpu 12:14.77 total

つまり、先ほど実行した eval "$(docker-machine env default)" に関しては

docker-machine env default の出力文字列をコマンドとして実行していると認識すれば良さそうです。


docker-machine env default

こちらの出力について確認をしました。

$ docker-machine env default

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.102:2376"
export DOCKER_CERT_PATH="/Users/user/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval $(docker-machine env default)

環境変数として上記の値が設定されていなかったため、今回のエラーになったようです。