Docker イメージを変更し、新しいタグをつけてpushする
image
container
docker build
docker run
みたいな用語が曖昧なところからスタートしています。
とある理由でlatestではないタグのイメージを使ってテストを回したいという希望が出て色々調べて、手を動かしてうまくいかなかったけど、うまくいきそうなところまで来た。その軌跡。
imageはオブジェクトで
containerはimageから作ったインスタンスです。
docker buildではdockerfileからimageを作成できます。
docker runではimageからcontainerを立ち上げます。この時ENTRYPOINTやCMDに登録したコマンドが実行されます。
まずは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がつけられました。
こういう挙動をするんですね。
これを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に新しいレポジトリができました。
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が更新される挙動のようです。
さらに変更を加えて
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が存在しています。
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の時はキャッシュ使って欲しくないようなそうでもないような。
用意されたdocker composeを利用することが多いので基本的なことを学べるいい機会でした。
container実行中に
docker commitすることで
例えばcontainer内でyum install gitでgitをインストールした状態のimageを作成することができますが、Dockerfileとは乖離してしまいますね。