---
slug: "install-cryptography-to-alpine-linux-docker-image-python-env"
title: "Alpine Linux の Docker イメージに Python 環境を構築する際、cryptgraphy のインストールで失敗する場合の回避方法 3選"
description: "Alpine Linux の Docker イメージで Python の `cryptography` を pip install するときに必要な `apk add` パッケージ一式と、よくあるビルドエラーの対処。"
url: "https://www.ytyng.com/blog/install-cryptography-to-alpine-linux-docker-image-python-env"
publish_date: "2022-08-11T15:06:11Z"
created: "2022-08-11T15:06:11Z"
updated: "2026-05-11T13:17:27.836Z"
categories: ["Python"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/3e5d4b905bbc41ff9c9db17381a07a59.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "ja"
---

# Alpine Linux の Docker イメージに Python 環境を構築する際、cryptgraphy のインストールで失敗する場合の回避方法 3選

<p>私のブログでも同様の記事を昔に書いたことがあるのですが、</p>
<p><a href="/blog/python-cryptography-pep-517-rust-E0658/">Python cryptography がインストールできなくなったら rustup で rust をインストールする | ytyng.com</a></p>
<p>Pipenv 等のバージョンロックシステムを使い、Alpine Linux の Docker イメージで Python 環境を構築しようとすると、インストールがうまくいかず躓く場合が多くあります。</p>
<p></p>
<p>Intel CPU でビルドがうまくいったとしても、同じ Dockerfile で Apple Silicon チップだとビルドに失敗する場合もあり、なかなか安定しません。</p>
<p>※ Intel CPU、Apple&nbsp;CPU 両方で <code>docker build --platform linux/amd64</code>&nbsp; オプションをつけてビルドしても、結果が安定しない場合があります。</p>
<p>解決方法としていくつかありますので、メモをしておきます。</p>
<p></p>
<h2>A. 環境を整えて Rust でコンパイルする</h2>
<p><a href="/blog/python-cryptography-pep-517-rust-E0658/">Python cryptography がインストールできなくなったら rustup で rust をインストールする | ytyng.com</a></p>
<p></p>
<p>この、以前書いた方法で行います。ただし、この場合、Intel CPU だと安定してビルドできますが、Apple CPU だと下記のようなエラーが出てビルドができない場合があります。</p>
<pre> Failed to install some dependency or packages. The following have failed installation and attempted retry: [Requirement(_name='cryptography', vcs=None, req=NamedRequirement(name='cryptography', version='==37.0.4', req=Requirement.parse('cryptography==37.0.4; python_version &gt;= "3.6"'), extras=[], editable=False, </pre>
<p>また、Rust のインストールと cryptography のビルドで非常に時間がかかります。</p>
<p></p>
<p>Dockerfile はだいたいこのような形になります。</p>
<pre>FROM alpine:3.15 as my-app-builder<br /><br />MAINTAINER ytyng<br /><br /># apk --virtual=.build-deps add &rarr; apk del .build-deps をすると、<br /># reqests とか six が消えてしまうので行ってはいけない。<br />RUN apk --no-cache add \<br /> python3 \<br /> py3-pip \<br /> python3-dev \<br /> gcc \<br /> make \<br /> python3-dev \<br /> musl-dev \<br /> libffi-dev \<br /> mariadb-dev \<br /> postgresql-dev \<br /> g++ \<br /> libgcc \<br /> libstdc++ \<br /> libxml2-dev \<br /> libxslt-dev \<br /> jpeg-dev \<br /> git \<br /> openssh \<br /> curl \<br /> &amp;&amp; curl https://sh.rustup.rs -sSf | sh -s -- -y \<br /> &amp;&amp; pip3 install pipenv --ignore-installed distlib \<br /> &amp;&amp; mkdir ~/.ssh/ &amp;&amp; ssh-keyscan -t rsa github.com &gt; ~/.ssh/known_hosts<br /><br />COPY Pipfile /tmp/Pipfile<br />COPY Pipfile.lock /tmp/Pipfile.lock<br /><br />RUN --mount=type=ssh source /root/.cargo/env \<br /> &amp;&amp; PIPENV_PIPFILE=/tmp/Pipfile pipenv sync --system \<br /> &amp;&amp; rustup self uninstall -y \<br /> &amp;&amp; rm -rf /var/cache/apk/* \<br /> &amp;&amp; rm -rf /tmp/*<br /><br /><br />FROM alpine:3.15<br />## ビルドイメージで作ったバイナリをコピー<br />COPY --from=my-app-builder /usr/lib/python3.9/site-packages/ \<br /> /usr/lib/python3.9/site-packages/<br /><br />RUN apk --no-cache add \<br /> python3 \<br /> bash \<br /> libxml2 \<br /> libxslt \<br /> libressl \<br /> &amp;&amp; ln -s /usr/bin/python3 /usr/bin/python<br /><br />USER nobody<br />WORKDIR /var/src/<br /><br />COPY . /var/src/</pre>
<p></p>
<h2>B. Pipenv.lock から cryptography を消して、apk でインストールする</h2>
<p>もし、上記の Rust で cryptography をインストールする方法がうまくいかない(もしくは、遅いので避けたい) 場合、pipenv で cryptography はインストールせず、apk でインストールするとうまくいきます。</p>
<p>(つまり、cryptography のバージョンロックは諦めます。)</p>
<p>Pipenv.lock を使って、pipenv sync コマンドで環境を作りたい場合は、<strong>事前になんらかの方法で Pipenv.lock から cryptography の項目を削除</strong>し、予め apk で <code>py3-cryptography</code> をインストールするようにすれば、Rust も不要で簡潔な Dockerfile になります。</p>
<p>ただし、Pipenv.lock から cryptography を自動的に消す、もしくは pipenv sync で cryptography だけインストールを除外する、といった方法はわからなかったため、継続して行うには別のスクリプトが必要そうです。</p>
<pre>FROM alpine:3.15 as my-app-builder<br /><br />RUN apk --no-cache add \<br /> python3 \<br /> py3-pip \<br /> python3-dev \<br /><strong> py3-cryptography</strong> \<br /> gcc \<br /> make \<br /> python3-dev \<br /> musl-dev \<br /> libffi-dev \<br /> mariadb-dev \<br /> postgresql-dev \<br /> g++ \<br /> libgcc \<br /> libstdc++ \<br /> libxml2-dev \<br /> libxslt-dev \<br /> jpeg-dev \<br /> git \<br /> openssh \<br /> curl \<br /> &amp;&amp; pip3 install pipenv --ignore-installed distlib<br /><br />COPY Pipfile /tmp/Pipfile<br />COPY Pipfile.lock /tmp/Pipfile.lock<br /><br />RUN <strong>PIPENV_PIPFILE=/tmp/Pipfile pipenv sync --system</strong><br /><br /><br />FROM alpine:3.15<br />## ビルドイメージで作ったバイナリをコピー<br />COPY --from=my-app-builder /usr/lib/python3.9/site-packages/ \<br /> /usr/lib/python3.9/site-packages/<br /><br />...</pre>
<p></p>
<h2>C. cryptography を apk でインストールして、ロックファイルを使わない</h2>
<p>多少強引な方法ですが、 cryptography は apk でビルド済みのものをインストールし、そのほかの依存関係は Pipfile.lock を使わずに、<strong>Pipfile だけで pipenv install してしまう</strong>方法もありだと思います。依存関係にシビアでない、それほど重要ではない Docker イメージの場合はありだと思います。</p>
<p><span>( cryptography に限らず、Pipfile に記載されていない依存性のバージョンロックをすべて諦めます。)</span></p>
<p>Apple CPU で X86_64 向けの Docker イメージをビルドする場合はこの B か C の方法が今の所安定してビルドできています。</p>
<pre>FROM alpine:3.15 as my-app-builder<br /><br />RUN apk --no-cache add \<br /> python3 \<br /> py3-pip \<br /> python3-dev \<br /> py3-cryptography \<br /> gcc \<br /> make \<br /> python3-dev \<br /> musl-dev \<br /> libffi-dev \<br /> mariadb-dev \<br /> postgresql-dev \<br /> g++ \<br /> libgcc \<br /> libstdc++ \<br /> libxml2-dev \<br /> libxslt-dev \<br /> jpeg-dev \<br /> git \<br /> openssh \<br /> curl \<br /> &amp;&amp; pip3 install pipenv --ignore-installed distlib<br /><br />COPY Pipfile /tmp/Pipfile<br /><br />RUN PIPENV_PIPFILE=/tmp/Pipfile pipenv install --system --skip-lock --deploy</pre>
<p></p>
<p></p>
