質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

324閲覧

Docker内にマウントしたはずのpyenvが見つからない

yiyi_

総合スコア3

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/12/12 10:59

実現したいこと

Dockerに.pyenvのフォルダをマウントしたものの、Dockerfileで環境変数を設定しても、Dockerfile内でpyenvコマンドが使えません。

nvidia-cudaを用いて環境構築を行うときのベストプラクティスも知りたいのですが、何故pyenvのコマンドが見つけられないか、それに対処するにはどうすれば良いかが一番知りたいです。

発生している問題・分からないこと

docker compose upをした際に、以下のエラーが発生する。
#0 0.398 /bin/bash: pyenv: command not found

該当のソースコード

docker

1services: 2 ub1804_cuda121_poetry_pyenv: 3 build: 4 context: . 5 dockerfile: Dockerfile 6 container_name: ub1804_cuda121_poetry_pyenv 7 runtime: nvidia 8 environment: 9 - NVIDIA_VISIBLE_DEVICES=4 10 - NVIDIA_DRIVER_CAPABILITIES=compute,utility 11 volumes: 12 - /home/username/projectname:/projectname 13 - /home/username/.pyenv:/root/.pyenv 14 stdin_open: true 15 tty: true 16 deploy: 17 resources: 18 reservations: 19 devices: 20 - driver: nvidia 21 count: 1 22 capabilities: [gpu] 23

Dockerfile

1FROM nvidia/cuda:12.1.0-devel-ubuntu18.04 2 3SHELL ["bash", "-c"] 4 5# Set pyenv environment variables 6ENV PYENV_ROOT="/root/.pyenv" 7ENV PATH="$PYENV_ROOT/bin:$PATH" 8 9RUN sed -i '/\[ -z "\$PS1" \] && return/d' ~/.bashrc 10 11# Install pyenv dependencies 12RUN apt-get update && apt-get install -y \ 13 git \ 14 curl \ 15 wget \ 16 build-essential \ 17 libssl-dev \ 18 zlib1g-dev \ 19 libbz2-dev \ 20 libreadline-dev \ 21 libsqlite3-dev \ 22 libffi-dev \ 23 python3-pip \ 24 && apt-get clean && rm -rf /var/lib/apt/lists/* 25 26 27# Install pyenv 28# RUN curl https://pyenv.run | bash 29 30# Initialize pyenv in the shell 31RUN echo 'eval "$(pyenv init --path)"' >> ~/.bashrc && \ 32 echo 'eval "$(pyenv init -)"' >> ~/.bashrc && \ 33 echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc 34 35# Install and set global Python version 36RUN /bin/bash -c "source ~/.bashrc && \ 37 pyenv install 3.11.9 && \ 38 pyenv global 3.11.9" 39 40# poetry のインストール 41RUN curl -sSL https://install.python-poetry.org | python3 - 42ENV PATH="/root/.local/bin:$PATH" 43 44# 作業ディレクトリ 45WORKDIR /projectname 46 47# デフォルトコマンド 48CMD ["bash"] 49

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

シェルを変えたり、このサイトを参考にしたり、いろいろと試しましたが、わかりませんでした。
docker runでコンテナ内に入って、実際に環境変数の設定だけ行うと、想定通りに動きます。
Dockerfileでビルドできない理由はよくわかっていません。

補足

  • Docker Compose version v2.18.1
  • docker version

Client: Docker Engine - Community
Version: 24.0.2
Server: Docker Engine - Community
Engine:
Version: 19.03.13

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2024/12/12 13:57

「特定のバージョンのPythonでイメージを作る」のではなく、「コンテナ内でpyenvを使う」ことを選択したのはどのような事情からでしょうか。
quickquip

2024/12/12 15:00

Dockerfileでコンテナ内に作ったpyenvを、volumesの指定でわざわざ見えなくしているように感じます(特に試す気はないのでコメントだけで)
yiyi_

2024/12/13 01:34

maisumakunさん、quickquipさん、コメントいただきありがとうございます...! >「特定のバージョンのPythonでイメージを作る」のではなく、「コンテナ内でpyenvを使う」ことを選択したのはどのような事情からでしょうか。 こちらについて、現在コンテナの外でpyenvがインストールしてあり、そちらで複数のバージョンのpythonを管理しています。容量をできるだけ少なく抑えたいので、コンテナの内部からコンテナの外にあるpyenv(python)が使えるようにしたいという感じです。 >Dockerfileでコンテナ内に作ったpyenvを、volumesの指定でわざわざ見えなくしているように感じます(特に試す気はないのでコメントだけで) こちらについて、Dockerfileのこの部分を見ていただけるとわかるのですが、 # RUN curl https://pyenv.run | bash となっていて、pyenvのインストールの部分はコメントアウトしています。Dockerの外にあるpyenvを使いたいのが、今回やりたいことになります。
quickquip

2024/12/13 02:16 編集

なるほど。コメントアウト見逃してました。だとしたら「意図的に使えなくしたから使えなくなった」だけではないでしょうか。インストールをコメントアウトしたら Dockerfileの36行目、RUN /bin/bash -c "source ~/.bashrc && \ の中で eval "$(pyenv init --path)" が失敗しますよね? (エラーがそう見えないので断言にならないのですが) > docker compose upをした際に、 がミスリードでしたがbuildのエラーに見えてきました docker compose build は通るのか、エラーが起きるならエラーが発生したレイヤーの全メッセージを質問に貼るのがよさそうです
bsdfan

2024/12/13 02:59

Dockerfile で pyenv のインストールをコメントアウトしてスキップしたなら、Dockerfile の時点では pyenv は使えないので、36~38行目でエラーになりそうです。(外の pyenv を使うなら、この部分もいらないと思います)
yiyi_

2024/12/13 07:02 編集

quickquipさん、bsdfanさん、コメントありがとうございます! まずquickquipさんのコメントについて、色々とこちらの説明不足で申し訳ないです! 推察していただいた通り、docker compose buildも失敗します。 エラー全文はこのような感じです。 $ docker compose build --no-cache [+] Building 37.7s (8/10) => [ub1804_cuda121_poetry_pyenv internal] load .dockerig 0.0s => => transferring context: 2B 0.0s => [ub1804_cuda121_poetry_pyenv internal] load build def 0.0s => => transferring dockerfile: 32B 0.0s => [ub1804_cuda121_poetry_pyenv internal] load metadata 0.0s => CACHED [ub1804_cuda121_poetry_pyenv 1/7] FROM docker. 0.0s => [ub1804_cuda121_poetry_pyenv 2/7] RUN sed -i '/\[ -z 0.4s => [ub1804_cuda121_poetry_pyenv 3/7] RUN apt-get update 36.3s => [ub1804_cuda121_poetry_pyenv 4/7] RUN echo 'eval "$(p 0.4s => ERROR [ub1804_cuda121_poetry_pyenv 5/7] RUN /bin/bash 0.6s ------ > [ub1804_cuda121_poetry_pyenv 5/7] RUN /bin/bash -c "source ~/.bashrc && pyenv install 3.11.9 && pyenv global 3.11.9": #0 0.605 /root/.bashrc: line 99: pyenv: command not found #0 0.607 /root/.bashrc: line 100: pyenv: command not found #0 0.609 /root/.bashrc: line 101: pyenv: command not found #0 0.610 /bin/bash: pyenv: command not found ------ failed to solve: failed to solve with frontend dockerfile.v0: failed to build LLB: executor failed running [bash -c /bin/bash -c "source ~/.bashrc && pyenv install 3.11.9 && pyenv global 3.11.9"]: runc did not terminate sucessfully >Dockerfile で pyenv のインストールをコメントアウトしてスキップしたなら、Dockerfile の時点では pyenv は使えないので、36~38行目でエラーになりそうです。(外の pyenv を使うなら、この部分もいらないと思います) こちらについて、詳しくお聞きしたいです!マウントしてパスを通せば使えるものと思っていました。Dockerfileでインストールをしなければ、Dockerfileの時点では絶対に使えないのでしょうか?Dockerの仕様の問題ですかね...?何かしらDockerfileの時点で用いる方法はないのでしょうか。 ご教示いただけますと幸いです。 ちなみに、36~38行目をコメントアウトして実行したところ、以下のエラーが発生して、poetryのインストールが失敗しました。 docker compose build --no-cache [+] Building 41.8s (8/9) => [ub1804_cuda121_poetry_pyenv internal] load build def 0.0s => => transferring dockerfile: 1.23kB 0.0s => [ub1804_cuda121_poetry_pyenv internal] load .dockerig 0.0s => => transferring context: 2B 0.0s => [ub1804_cuda121_poetry_pyenv internal] load metadata 0.0s => CACHED [ub1804_cuda121_poetry_pyenv 1/6] FROM docker. 0.0s => [ub1804_cuda121_poetry_pyenv 2/6] RUN sed -i '/\[ -z 0.4s => [ub1804_cuda121_poetry_pyenv 3/6] RUN apt-get update 35.6s => [ub1804_cuda121_poetry_pyenv 4/6] RUN echo 'eval "$(p 0.4s => ERROR [ub1804_cuda121_poetry_pyenv 5/6] RUN curl -sSL 5.4s ------ > [ub1804_cuda121_poetry_pyenv 5/6] RUN curl -sSL https://install.python-poetry.org | python3 -: #0 5.373 Retrieving Poetry metadata #0 5.373 #0 5.373 # Welcome to Poetry! #0 5.373 #0 5.373 This will download and install the latest version of Poetry, #0 5.373 a dependency and package manager for Python. #0 5.373 #0 5.373 It will add the `poetry` command to Poetry's bin directory, located at: #0 5.373 #0 5.373 /root/.local/bin #0 5.373 #0 5.373 You can uninstall at any time by executing this script with the --uninstall option, #0 5.373 and these changes will be reverted. #0 5.373 #0 5.373 Installing Poetry (1.8.5) #0 5.373 Installing Poetry (1.8.5): Creating environment #0 5.373 Installing Poetry (1.8.5): Installing Poetry #0 5.373 Installing Poetry (1.8.5): An error occurred. Removing partial environment. #0 5.373 Poetry installation failed. #0 5.373 See /poetry-installer-error-v0ntre4b.log for error logs. ------ failed to solve: failed to solve with frontend dockerfile.v0: failed to build LLB: executor failed running [bash -c curl -sSL https://install.python-poetry.org | python3 -]: runc did not terminate sucessfully
bsdfan

2024/12/14 00:40

> こちらについて、詳しくお聞きしたいです!マウントしてパスを通せば使えるものと思っていました。Dockerfileでインストールをしなければ、Dockerfileの時点では絶対に使えないのでしょうか?Dockerの仕様の問題ですかね...?何かしらDockerfileの時点で用いる方法はないのでしょうか。 ボリュームのマウントは、コンテナを実行するときの話なので、イメージをbuildするときには関係ありません。パスワード等のsecretをマウントで渡すための機能はありますが、今回のケースには使えないと思います。 poetry のインストールエラーはログを確認したら何かわかると思います。 ただ、Dockerでpyenvを使うメリットはあまりないと思いますし、外の pyenv 環境をマウントして使うなら、ますます何のためにコンテナを使うのかわかりません。なんとなくしなくていい苦労をしているように見えます。
yiyi_

2024/12/14 06:23

なるほどです。教えてくださり、ありがとうございます! >ボリュームのマウントは、コンテナを実行するときの話なので、イメージをbuildするときには関係ありません。 これが一番お聞きしたかったことのような気がします。 こういったDockerやdocker composeの仕様を自分で調べられたら良かったのですが...。 poetryの方は、ログの確認方法はわからなかったのですが、元々入っていたpythonのバージョンが古いことが原因のようでした。pythonをそのままダウンロードする方法も調べたのですが、元々のpythonに特定のバージョンのpythonへのシンボリックリンクを張っているものが多く、また逆にそのやり方が良くないとされる情報もあったため、やはりpyenvをインストールして特定のバージョンのpythonを使用することにし、解決しました。 pyenvをインストールしたうえで、pythonコマンドで使うpythonのバージョンが変化しない問題もあったのですが、 ENV PATH="$PYENV_ROOT/shims:$PATH" を加えることでそちらも解決しました。 もしよければ、ベストアンサーの方に選ばせていただきますので、回答の方よろしくお願いいたします。 ありがとうございました!
quickquip

2024/12/14 06:25

コンテナの中で使いたいPythonは1個しかないはずで、shimsを使う必要がありますか?
yiyi_

2024/12/14 06:31

コメントありがとうございます! わからないのですが、そちらのPATHを通さないと、他のレイヤでpythonを用いる際に、pyenvでインストールしたpythonが認識されないようでした。 参考までに、現在のDockerfileを載せておきます。これでbuildは出来たようです。 # ベースイメージを指定 FROM nvidia/cuda:12.1.0-devel-ubuntu18.04 ARG PYTHON="3.11.9" # Install pyenv dependencies RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive TZ=Asia/Tokyo apt-get install -y \ git \ curl \ wget \ make \ llvm \ build-essential \ libssl-dev \ zlib1g-dev \ libbz2-dev \ libreadline-dev \ libsqlite3-dev \ liblzma-dev \ libffi-dev \ libncursesw5-dev \ xz-utils \ tk-dev \ libxml2-dev \ libxmlsec1-dev \ python3 \ python3-pip \ python3-venv \ && apt-get clean && rm -rf /var/lib/apt/lists/* # pyenv + python ENV PYENV_ROOT="$HOME/.pyenv" ENV PATH="$PYENV_ROOT/bin:$PATH" ENV PATH="$PYENV_ROOT/shims:$PATH" RUN curl https://pyenv.run | bash && \ echo 'eval "$(pyenv init --path)"' >> ~/.bashrc && \ echo 'eval "$(pyenv init -)"' >> ~/.bashrc && \ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc && \ /bin/bash -c "source ~/.bashrc" && \ /bin/bash -c "pyenv install ${PYTHON} && pyenv global ${PYTHON}" # poetry のインストール ENV PATH="/root/.local/bin:$PATH" RUN /bin/bash -c "python3 --version" && \ curl -sSL https://install.python-poetry.org | python3 - && \ poetry config virtualenvs.create true --local && \ poetry config virtualenvs.in-project true --local # 作業ディレクトリ #WORKDIR /geometry # デフォルトコマンド CMD ["bash"]
quickquip

2024/12/14 06:40 編集

build時はいいですが使う時は $HOME/.pyenv/versions/3.11.9/bin にパスが通っていれば十分ではないでしょうか? あとPoetryは仮想環境を作るのに使っているわけではないですか? 仮想環境を作っているなら使うのは仮想環境の方ではないでしょうか? (virtualenvs.create false にしてpyenvの中を書き換えてるとしても上記の通り$HOME/.pyenv/versions/3.11.9/bin でよいはず)
yiyi_

2024/12/14 06:45

何かしらで、本体のpythonにシンボリックリンクを張るのは良くないと見た気がするのですが、見つけられませんでした。この記事のように特定のバージョンをビルドするのが主流なのかな?という印象を受けています。何がベストプラクティスなのか、難しいです。 https://qiita.com/takumiw/items/2555fb1070a5014a94bc#4-docker%E3%81%A7tensorflow23--python38%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89
quickquip

2024/12/14 06:51 編集

"Dockerコンテナ"という隔離した環境を作るための仕組みを使っているのだから、その中では単一のPython環境しかない(というかそれ以外のPython環境など作らせない)という前提でもよいと思いますが (bsdfanさんからもなぜコンテナを使うのか? と質問されてると思います)
yiyi_

2024/12/14 06:58

すみません、コメントありがとうございます! なるほど。ビルド時には必要ですが、実際にコンテナの中に入って使用するときにはそのPATH自体不要という感じなんですかね? PATHも、ビルド時にだけそのPATHを追加するような状態にした方が良かったりするのでしょうか? 確かに、特定のpythonのバージョン以外を用いることができるようにする必要はないと思いました!
quickquip

2024/12/14 07:54

pyenvの中の3.11.9(かpoetryで作った仮想環境)だけ使えればよくて、shimsは要らないのではといことです 好き好きだとは思いますし「パス環境はpyenvやpoetryにお任せ」ならそれはそれで気にならないのですが、パスを **手作業で** 明に書いたのならshimsでなくてもいいのでは、という話でした
bsdfan

2024/12/14 12:51

コメントのやり取りをまとめて、結論を書いて、自己解決にしてもらうのがいいのかなと思います。 王道はソースをとってきてビルドしてインストールするところを Dockerfile に書くことだと思いますが、初心者には厳しいですよね。その部分を pyenv にやらせるという感じかな。
yiyi_

2024/12/15 14:54

quickquipさん、bsdfanさん、ありがとうございます...! なるほど、shimsが行っている役割なども今調べて理解しました。 teratailを使わせていただくのは初めてだったのですが、すごく参考になりました。後程まとめて解決にしておきます。本当にありがとうございました...!
guest

回答1

0

自己解決

知りたかったこと

  • Dockerfile内でpyenvコマンドが使えない理由
  • nvidia-cudaを用いて環境構築を行うときのベストプラクティス

わかったこと

  • docker composeのvolumeのマウントは、コンテナ実行時に反映されるため、buildで使うことはできない
  • コンテナの内部で複数のバージョンのpythonを用いるケースは稀なので、pyenvで環境の構築を行うより、直接特定のバージョンのpythonをインストールする方法が主流である

最終的に採用したdocker-compose.ymlとDockerfile

docker-compose.yml

services: ub1804_cuda121_poetry_pyenv: build: context: . dockerfile: Dockerfile container_name: ub1804_cuda121_poetry_pyenv runtime: nvidia environment: - NVIDIA_DRIVER_CAPABILITIES=compute,utility volumes: - /home/username/projectname:/workspaces/projectname working_dir: /workspaces/geometry stdin_open: true tty: true deploy: resources: reservations: devices: - driver: nvidia device_ids: ['4'] capabilities: [gpu]

Dockerfile

FROM nvidia/cuda:12.1.0-devel-ubuntu18.04 ARG PYTHON="3.11.9" # Install dependencies RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive TZ=Asia/Tokyo apt-get install -y \ git \ curl \ wget \ make \ llvm \ build-essential \ libssl-dev \ zlib1g-dev \ libbz2-dev \ libreadline-dev \ libsqlite3-dev \ liblzma-dev \ libffi-dev \ libncursesw5-dev \ xz-utils \ tk-dev \ libxml2-dev \ libxmlsec1-dev \ python3 \ python3-pip \ python3-venv \ && apt-get clean && rm -rf /var/lib/apt/lists/* # install python RUN wget -q "https://www.python.org/ftp/python/${PYTHON}/Python-${PYTHON}.tar.xz" &&\ tar xvf Python-${PYTHON}.tar.xz && \ cd Python-${PYTHON} &&\ ./configure --enable-optimizations --without-ensurepip --enable-loadable-sqlite-extensions && \ make -j 8 &&\ make install && \ cd ../ && rm -rf Python-${PYTHON} && \ python3 -V && \ ln -s /usr/local/bin/python3 /usr/local/bin/python # install poetry ENV PATH="/root/.local/bin:$PATH" RUN curl -sSL https://install.python-poetry.org | python3 - && \ poetry config virtualenvs.in-project true --local # default command CMD ["bash"]

投稿2024/12/15 15:13

yiyi_

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問