例えばGitHubなどのサービスに上げたDockerfileをDocker HubでビルドするときにDockerfileをrootディレクトリ以外に置いているということはよくあると思う。

環境など


例えば下記のように一つのリポジトリにソースコードとかDocker周りのアレコレを含んでいるようなディレクトリ構成だとする。

1
2
3
4
5
6
├── docker
│ ├── Dockerfile
│ └── entry-point.sh
├── src
│ ├── ...
...

これをGitHubに上げてDocker Hubでビルドしたいという場合に、docker/Dockerfileを使ってビルドして欲しい。しかし、Docker HubではデフォルトでrootにDockerfileが存在する前提になっているので、設定で変更してやる必要がある。

設定


これを変更するにはBuilds -> Configure Automated Builds -> BUILD RULESで設定変更する必要がある。いくつか試した結果、下記のように考えるとよいとおもう。

  • Build ContextはビルドするDockerfileが格納されているディレクトリを指定
  • Dockerfile locationDockerfileのファイル名を指定

これをもとにすると前述のサンプルは次のようになる。ディレクトリやDockerfile名は適宜読み替えて欲しい。

  • Build Context に docker/
  • Dockerfile location に Dockerfile

Dockerfile location にDockerfile込みのパスを指定してはいかんのか??


実のところかなり長らくDockerfile locationにdocker/DockerfileというようにDockerfileを含めたパスを指定する方法でやっていた。具体的には下記のようにBuild Contextに/を指定して、Dockerfile location に docker/Dockerfileという指定の仕方。

が、この指定の仕方だと例えばDockerfile内でCOPYとかを使っていると下記のようにファイルが見つからずにビルドエラーになる。

1
2
3
4
5
---> Running in bc28fa3105c8
Removing intermediate container bc28fa3105c8
---> 4c9def15e799
Step 7/9 : COPY entry-point.sh entry-point.sh
COPY failed: stat /var/lib/docker/tmp/docker-builder254886284/entry-point.sh: no such file or directory

今回Dockerfile内でエントリーポイントのスクリプトをCOPYする必要性が出てきて、その過程で詰まったのでこの記事を書いた。

おわり。