表題のとおり「Helix Core (以下、Perforce)」を Docker 上に構築する手順を紹介します。
基本的な手順はPerforceの公式ドキュメントに記載されているものと同じで、一部Docker用に書き換えてます。1
なお、Dockerまわりの機能の詳細については今回は割愛します。
また、細かい話は無視してとりあえず試してみたいという方は、以下のリポジトリをご確認ください。
今回の構成
- ホストOS:Windows 11
- Docker Desktop:4.38.0
- ベースイメージ:Ubuntu 24.04 LTS(noble)
Dockerfileを作成
今回はUbuntuイメージをベースに、Perforce構築までの手順をDockerfileに記述します。
各コマンドの詳細はコメントに記載してます。
FROM ubuntu:noble
# いったんリポジトリを更新
RUN apt-get update
# 事前に必要となるパッケージをインストール
# 「--no-install-recommends」でインストールするパッケージを必須のものだけに絞り、
# 推奨パッケージが一緒にインストールされないように
RUN apt-get install -y --no-install-recommends ca-certificates wget gnupg
# のちの署名検証に使用するPerforceの公開鍵を登録
RUN wget -qO - https://package.perforce.com/perforce.pubkey | gpg --dearmor | tee /usr/share/keyrings/perforce.gpg
# Perforceのリポジトリを登録
# signed-by=/usr/share/keyrings/perforce.gpgで、
# 先で登録した公開鍵を署名検証の際に使用するよう設定
RUN echo "deb [signed-by=/usr/share/keyrings/perforce.gpg] https://package.perforce.com/apt/ubuntu noble release" > /etc/apt/sources.list.d/perforce.list
# 再度リポジトリの更新を行い、登録したリポジトリを反映する
# ここで署名検証が行われる
RUN apt-get update
# p4-serverをインストール
RUN apt-get install -y p4-server
# Perforceのインスタンスを作成
# master : インスタンス名
# -p : サーバーアドレス
# -r : インスタンスのデータ保存されるルートディレクトリ
# -u : スーパーユーザー(管理者)のユーザー名
# -P : スーパーユーザー(管理者)のパスワード
# -n : 非対話モードで実行する
# --unicode : Unicodeモードを有効に(メタデータやログがUTF-8に変換される)
RUN /opt/perforce/sbin/configure-p4d.sh \
master \
-p 1666 \
-r /opt/perforce/servers/master \
-u adminuser \
-P adminpass2468! \
--unicode -n
# 作成したインスタンスを実行
CMD ["sh","-c","p4dctl start master && tail -F /opt/perforce/servers/master/logs/log"]
今回は各行で何をやっているのか分かりやすくするため、あえてRUNを分割しています。
実運用では、Dockerのビルドキャッシュの最適化を考慮し、ある程度まとめるのが望ましいかと思います。2
起動してみる
作成したDockerfileを使用して、Perforceを起動してみます。
Dockerfileを配置しているディレクトリで以下のコマンドを実行します。
# Dockerfileをビルド
docker build -t p4-server .
# ビルドしたイメージから実行
# Perforceが使用するポート1666をホストに公開
# インスタンスのデータをDockerの名前付きボリュームで永続化
docker run -d --name p4d -p 1666:1666 -v master:/opt/perforce/servers/master p4-server
コンテナ側で以下のようなログが表示されていたら成功です。
2025-xx-xx xx:xx:xx Started 'master' p4d service.
2025-xx-xx xx:xx:xx Started 1 services.
クライアント側で接続確認
クライアント用のツールを以下からダウンロードします。
起動直後は以下の画面が表示されるので、それぞれ入力して「OK」を選択。
- Server : Perforceを構築しているサーバーのアドレス
- User : スーパーユーザー(管理者)のユーザー名
使用する文字エンコードを聞かれるので、選んで「OK」を選択。
この画面が表示されたら接続成功です。
おまけ
今回は分かりやすさ重視で、Dockerfileにすべて記載しましたが、以下のような問題があります。
- インスタンス名やポート、データディレクトリなどのインスタンス固有の情報がDockerfileに記述されてるので、イメージの使いまわしができない。
- Dockerfileにパスワードが直書きされてるので、パスワードがそのままイメージに焼きこまれてしまい、セキュリティ的にまずい。
なので、それらを解消した構成をGitHubに公開しています。
このリポジトリの構成では、環境変数を利用し、インスタンス固有の設定を外に切り出すことで、イメージを使いまわせるようにしてます。
また、DockerのBuild secrets3 を利用することで、パスワードなどの機密情報を環境変数やイメージに焼き込むことなく安全に渡せるようにしています。
Build secretsは一時的に/run/secrets/…としてマウントされ、ビルド後のイメージには残りません。