podmanでdocker-compose使用時のビルドエラーに対応する
podman
でdocker-compose
を使用すると、イメージのビルド時に「FileNotFoundError: [Errno 2] No such file or directory: 'docker':」が出る- イメージビルド時に
docker
コマンドを実行するが、docker
コマンドが無いため /usr/local/bin
などにdocker
という名前で、podman
を実行するシェルスクリプトを作成する
環境
- CentOS 8 Stream
- podman 3.3.1 (rootで実行)
- docker-compose 1.29.2
podmanでdocker-composeを使う
以下参照。ルートレスモードはまだ試して無いです。
イメージビルド時のエラー
手順に従ってセットアップしdocker-compose up -d
を実行するとエラーとなる。少し調べると、イメージのビルド (build:/Dockerfileの指定) が含まれているとエラーになることがわかる。
File "/usr/local/lib/python3.6/site-packages/compose/service.py", line 1133, in build output_stream=output_stream) File "/usr/local/lib/python3.6/site-packages/compose/service.py", line 1943, in build universal_newlines=True) as p: File "/usr/lib64/python3.6/subprocess.py", line 729, in __init__ restore_signals, start_new_session) File "/usr/lib64/python3.6/subprocess.py", line 1364, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'docker': 'docker'
エラーメッセージはイマイチピンと来ないのでソースコード (service.pyの1943行目あたり)をみてみると、イメージのビルドはsubprocess.Popen
でdocker
コマンドを呼び出していることがわかる。
podman
環境でdocker
コマンドは存在しない。ただ、コマンド自体には互換性があるので、代わりにpodman
を実行できるようにシェルスクリプトを準備することにする。
ちなみに、イメージのビルドが実行されなければエラーにならない。事前にpodman build
でイメージを作成しておくと、docker-compose
実行時にイメージビルドが走らないので、エラーにならずに実行できる。
dockerシェルスクリプトを準備する
/usr/local/bin
(とかのパスが通っているところ) にdocker
という名前でpodman
を実行するシェルスクリプトを準備する。
# vim /usr/local/bin/docker #!/bin/bash podman $@
実行権限もつけとく。
# chmod +x /usr/local/bin/docker
再度docker-compose
を実行。イメージのビルドが実行され、コンテナが立ち上がる。
# docker-compose up -d Building http STEP 1/7: FROM httpd:latest STEP 2/7: ENV DATAACCEPTOR_HOST=127.0.0.1 --> 201026ad839 ...