Open9

Docker イメージを変更し、新しいタグをつけてpushする

Koji KobayashiKoji Kobayashi

image
container
docker build
docker run
みたいな用語が曖昧なところからスタートしています。

とある理由でlatestではないタグのイメージを使ってテストを回したいという希望が出て色々調べて、手を動かしてうまくいかなかったけど、うまくいきそうなところまで来た。その軌跡。

Koji KobayashiKoji Kobayashi

imageはオブジェクトで
containerはimageから作ったインスタンスです。
docker buildではdockerfileからimageを作成できます。
docker runではimageからcontainerを立ち上げます。この時ENTRYPOINTやCMDに登録したコマンドが実行されます。

Koji KobayashiKoji Kobayashi

まずはDockerfileに適当に記述して、docker hubに登録するところまで
今回はRailsのimageを作りましょうか。

FROM ruby:2.6.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

ビルドします。

docker build .

イメージができたか確認

$ docker images
REPOSITORY                           TAG                                                     IMAGE ID       CREATED          SIZE
<none>                               <none>                                                  d20bb329d9ca   34 seconds ago   899MB

名無しの何かができましたね。
名前をつけてあげたほうがいいので

docker build -t my-rails .

とでもしましょうか。

REPOSITORY                           TAG                                                     IMAGE ID       CREATED         SIZE
my-rails                             latest                                                  d20bb329d9ca   4 minutes ago   899MB

IMAGE IDを見るとわかりますが、さっきの名無しのimageにタグlatestがつけられました。
こういう挙動をするんですね。

Koji KobayashiKoji Kobayashi

これをDocker hubに上げます。
まずログインします。

docker login -ucozynooks -p<my-password>

タグをつけます

docker tag my-rails cozynooks/my-rails:latest

docker hubのユーザー名/リポジトリ名:ラベルとします。

$ docker images
REPOSITORY                           TAG                                                     IMAGE ID       CREATED          SIZE
cozynooks/my-rails                   latest                                                  d20bb329d9ca   13 minutes ago   899MB
my-rails                             latest                                                  d20bb329d9ca   13 minutes ago   899MB

こういう挙動になるんですね。
同じイメージから名前空間を切られたレポジトリができました。
docker hubの名前空間と同じになるように名前をつけてあげることが必要なようです。

docker push cozynooks/my-rails

pushします。

docker hubに新しいレポジトリができました。

Koji KobayashiKoji Kobayashi
touch Gemfile
touch Gemfile.lock

をして

Dockerfileも追加しました。

FROM ruby:2.6.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
docker build -t cozynooks/my-rails .

でimageを作成します。

docker push cozynooks/my-rails

再度push
履歴が残ることを期待しましたが、latestが更新される挙動のようです。

Koji KobayashiKoji Kobayashi

さらに変更を加えて

FROM ruby:2.6.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

開発中にlatestを壊したくないのでdevelop用のタグをつけてみます。

docker build -t cozynooks/my-rails:develop .
docker push cozynooks/my-rails:develop

developタグがついてpushされました。
docker hubにはlatestとdevelopが存在しています。

Koji KobayashiKoji Kobayashi

Gemfileに何の記述もないので

source 'https://rubygems.org'
gem 'rails', '~> 6'

として再度

docker build -t cozynooks/my-rails:develop .
 => CACHED [ 2/10] RUN apt-get update -qq && apt-get install -y nodejs postgresql-client                                                      0.0s
 => CACHED [ 3/10] RUN mkdir /myapp                                                                                                           0.0s
 => CACHED [ 4/10] WORKDIR /myapp                                                                                                             0.0s
 => CACHED [ 5/10] COPY Gemfile /myapp/Gemfile                                                                                                0.0s
 => CACHED [ 6/10] COPY Gemfile.lock /myapp/Gemfile.lock                                                                                      0.0s
 => CACHED [ 7/10] RUN bundle install                                                                                                         0.0s
 => CACHED [ 8/10] COPY . /myapp                                                                                                              0.0s
 => CACHED [ 9/10] COPY entrypoint.sh /usr/bin/                                                                                               0.0s
 => CACHED [10/10] RUN chmod +x /usr/bin/entrypoint.sh                                                                                        0.0s

キャッシュを使ってしまって、bundle installが走っていないようでした。
cacheを使用しないビルドは

docker build --no-cache -t cozynooks/my-rails:develop .

のようにすればいいのですが、buildの時はキャッシュ使って欲しくないようなそうでもないような。

Koji KobayashiKoji Kobayashi

用意されたdocker composeを利用することが多いので基本的なことを学べるいい機会でした。

Koji KobayashiKoji Kobayashi

container実行中に
docker commitすることで
例えばcontainer内でyum install gitでgitをインストールした状態のimageを作成することができますが、Dockerfileとは乖離してしまいますね。