Docker のメモ
#tech #deprecated
https://speakerdeck.com/aruneko/dockerdedokadoka-on-furait-number-36
ビルドから実行まで
ビルドと初回の実行
code:sh
$ echo '*' > .dockerignore
$ docker build -t imageName:tag .
$ docker run -v pwd:pwd -w pwd -it --name containerName imageName:tag /bin/bash
マウントで指定したディレクトリより上はマウントされない
単に * とした場合は全てを無視する
二回目以降の実行
code:sh
$ docker start -i container
停止しているコンテナも表示する
docker ps -a
コンテナの削除は rm 、イメージの削除は rmi
どんどんコンテナの残骸がたまっていくのでたまには docker rm $(docker ps -a -q) する
https://docs.docker.com/engine/reference/commandline/rm/#remove-all-stopped-containers
コンテナ内で日本語を入力/表示する
Ubuntuイメージの場合は以下のようにして docker run で /bin/bash を指定する
code:dockerfile
RUN \
apt-get update && \
apt-get install -y language-pack-ja-base language-pack-ja && \
rm -rf /var/lib/apt/lists/* && \
echo 'export LANG=ja_JP.utf8' >> ~/.bashrc
最後の行は ENV LANG ja_JP.utf8 でもいいかも
コンテナの名前やタグを変更する
DockerHubに docker push したいときなど
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
コンテナを複製する
docker commit で既存のコンテナからイメージを作れる
リソースの割り当てなど docker run でしか設定できない項目を変更したい場合に便利
code:sh
$ docker commit containerNameOrID imageName:tag
コンテナに入らずプロセスを実行する
https://qiita.com/RyoMa_0923/items/9b5d2c4a97205692a560
code:sh
$ docker exec container sh ~/run.sh args
docker exec は実行中の指定したコンテナで指定したコマンドを実行するコマンド
ワーキングディレクトリは -w で、環境変数は -e で設定できる
-d で出力を出さずバックグラウンドで作業させられる
-it で docker attach のようにコンテナの内で作業できるが、 exec の場合 exit してもコンテナが終了しない
コンテナのサイズを見る
docker ps -as の SIZE の virtual を見ればよい
これは docker images で見れるイメージの SIZE と一致する
その他
docker stats
you cannot start and attach multiple containers at once
docker start -i container /bin/bash とかしている場合に出る
正しくは docker start -i container のため、 /bin/bash というコンテナも指定されていると解釈され上のようなエラーが出る
Docker for Windows
Hyper-Vを有効にする必要がある
https://github.com/docker/for-win/issues/1539#issuecomment-393228181
0x80070002 が出た場合はセーフモードで有効にできる
Dockerは chroot などLinuxの機能を使うため、Windowsの場合VMが必要ということ
docker run -m 8GB なども、GUIからVMのメモリ割り当てを変更しないと効果がない
マウントとpwd
PowerShellにも pwd があり、 $pwd や ${pwd} のように使えるが、ボリュームは C: を c: と指定する必要があるので使えない
code:posh
docker pull ubuntu:16.04
cd C:\workspace
docker run -v c:/workspace:/workspace -w /workspace -it --name ubuntu ubuntu:16.04 /bin/bash
PowerShellから日本語入力ができない
PowerShellの問題、 CodePage をutf-8に変更してやる
code:posh
chcp 65001
その後タイトルバーを右クリックしてプロパティを開き、フォントをMSゴシックなど日本語に対応したものにする
Dockerfile
https://docs.docker.com/develop/develop-images/dockerfile_best-practices
source
https://stackoverflow.com/questions/20635472/using-the-run-instruction-in-a-dockerfile-with-source-does-not-work
Dockerfileのビルドはbashではなくshで実行されるため、 source などPOSIXにないコマンドやbashの拡張は使えない
一行だけなら RUN /bin/bash -c "source ..." && ... で、その RUN 自体をbashで走らせるなら RUN ["/bin/bash", "-c", "source ..."]
最初に RUN ln -snf /bin/bash /bin/sh や RUN rm /bin/sh && ln -s /bin/bash /bin/sh したり、 SHELL ["/bin/bash", "-c"] でデフォルトのシェルを上書きする方法もあるが、bashにはPOSIXのものと全く異なる振る舞いをするコマンドもあるため推奨されない
echo -e もPOSIXでは実装依存で、 -e も出力されてしまう場合があるため、 printf を使うべき
vimを入れる
ただテキストファイルを編集したいだけなら、最小構成の vim-tiny を入れるのがよい
vim.tiny で呼べる
ENVとARGの違い
https://blog.lorentzca.me/use-argument-in-dockerfile/
CMDとENTRYPOINTの違い
https://qiita.com/hihihiroro/items/d7ceaadc9340a4dbeb8f
http://kimh.github.io/blog/jp/docker/gothas-in-writing-dockerfile-jp/
https://qiita.com/hnakamur/items/afddaa3dbe48ad2b8b5c
CMD は docker run のcommandのデフォルトを指定する
entrypoint.shのset -eo pipefail
https://stackoverflow.com/questions/39082768/what-does-set-e-and-exec-do-for-docker-entrypoint-scripts
https://github.com/koalaman/shellcheck/wiki/SC2096
まず exec "$@" は必須だが、 exec はPOSIXにないbashの組み込みコマンドのため、 #!/bin/bash を指定する
#!/bin/bash は #!/bin/bash -eo pipefail のように複数の引数はとれないため、 set -eo pipefail としている
つまり | を使っていない場合は -e だけで十分なので、 set を使わず #!/bin/bash -e で済ませてもよい
ちなみに set もPOSIXにはないbashの組み込みコマンド
.dockerignoreの動作を確認する
https://stackoverflow.com/questions/43808558/docker-command-option-to-display-or-list-the-build-context
code:Dockerfile
FROM ubuntu
RUN mkdir /tmp/build/
ADD . /tmp/build/
元のイメージはなんでもいいが、上のようなファイルを作って
code:sh
$ docker build -t test .
$ docker run --rm -it test find /tmp/build
とすることで確認できる
ビルドに失敗したとき中間コンテナを破棄する
docker build --force-rm .
もちろん中間コンテナに入ってデバッグする場合もあるので一長一短
DockerHubにイメージを上げる
https://docs.docker.com/docker-hub/repos/#pushing-a-repository-image-to-docker-hub
事前にDockerHubでリポジトリを作っておく
docker login でログインして、 docker push SOURCE_IMAGE[:TAG] で上げる
このとき SOURCE_IMAGE は DockerHubのアカウント名/リポジトリ名 にする必要があるので、 docker tag でリネームする
その他
.dockerignore で全てのファイルとフォルダを無視する
echo '*' > .dockerignore もしくは echo '**' > .dockerignore
DockerHub上のイメージのサイズ < pullしてきたイメージのサイズ
DockerHub上に同じレイヤーが存在すればそれが使われるため
ディストリビューション毎の注意点
Ubuntu
apt を使うと警告がでる
https://askubuntu.com/questions/990823/apt-gives-unstable-cli-interface-warning
apt install のかわりに apt-get install を使うべき
apt-get install -y --no-install-recommends
本当に必須のものだけを入れる
python3.6を入れる
https://askubuntu.com/questions/865554/how-do-i-install-python-3-6-using-apt-get
pyenv などの選択肢もあるが、
code:dockerfile
FROM ubuntu:16.04
RUN \
apt-get update && \
apt-get install -y software-properties-common && \
add-apt-repository -y ppa:deadsnakes/ppa && \
apt-get update && \
apt-get install -y python3.6 python3.6-dev curl && \
rm -rf /var/lib/apt/lists/*
RUN curl https://bootstrap.pypa.io/get-pip.py | python3.6
とするのが一番楽
python3.6 で呼び出せ、これに pip install したい場合は python3.6 -m pip install もしくは pip3.6 install とする
Alpine
SSL通信で wget が失敗する
apk add --no-cache ca-certificates && update-ca-certificates が必要
https://github.com/docker-library/official-images/issues/2773
https://github.com/Yelp/dumb-init/issues/73