kkAyatakaのメモ帳。

誰かの役に立つかもしれない備忘録。

podmanでdocker-compose使用時のビルドエラーに対応する

  • podmandocker-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.Popendockerコマンドを呼び出していることがわかる。

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
...