Docker for Macで久しぶりにAlpine LinuxをベースにDockerfileを作ってみました。
Alpineだとほぼ何も入っていない軽量OSなので、ハマった点をいくつか紹介したいと思います。
■Environment
1 2 3 4 5 6 7 |
> tree . ├── docker-compose.yml ├── Dockerfile ├── nginx │ └── adachin.conf └── service.sh |
■インストール
- Go1.11.1
- Nginx
各ミドルウェアやアプリケーションはservice.shで立ち上がるようにしました。Alpineの起動スクリプトはopenrcを使えば可能です。しかし軽量化となると無駄なパッケージは入れたくないものです。(以下前回のブログより)
■Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
FROM alpine # basic install RUN apk update RUN apk add --no-cache wget bash git supervisor gcc build-base # install glibc RUN wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub RUN wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk RUN apk add glibc-2.28-r0.apk RUN rm /etc/apk/keys/sgerrand.rsa.pub glibc-2.28-r0.apk # go 1.11.1 install,delete gz RUN wget https://dl.google.com/go/go1.11.1.linux-amd64.tar.gz --no-check-certificate -P /tmp RUN tar -C /usr/local -xzf /tmp/go1.11.1.linux-amd64.tar.gz && rm /tmp/go1.11.1.linux-amd64.tar.gz # settimg go path ENV GOPATH /go ENV PATH $PATH:/usr/local/go/bin:$GOPATH/bin # install nginx RUN apk add nginx RUN mkdir -p /run/nginx # copy adachin.conf WORKDIR /etc/nginx/conf.d/ COPY ./nginx/adachin.conf adachin.conf # build directories RUN mkdir -p /go/src/github.com/adachin-go WORKDIR /go/src/github.com/adachin-go # go get RUN go get -u github.com/pressly/goose/cmd/goose github.com/lestrrat-go/test-mysqld github.com/volatiletech/sqlboiler github.com/volatiletech/sqlboiler/drivers/sqlboiler-mysql github.com/golang/dep/cmd/dep github.com/tockins/realize # copy service.sh COPY service.sh /root/service.sh # clean apk cache RUN rm -rf /var/cache/apk/* |
AlpineでGoとなるとglibcが必須となります。(以下URL参考)ですが、Alpineはapk install glibcしてもインストールできないので、wgetでリポジトリを取ってきましょう。他にも、go getで何度もRUNするよりも、複数パッケージを並べて書いたほうが高速にダウンロードできます。(10秒くらい違う) 他にもnginxのpidファイル格納しているディレクトリがなかったりなどトホホ。。。
・service.sh
1 2 3 4 5 6 7 8 9 |
#!/usr/bin/env bash cd /go/src/github.com/adachin-go realize start & nginx -g "daemon off;" while true do sleep 10 done |
・adachin.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
upstream backend { server unix:/var/run/go.sock; } server { listen 8080; server_name adachin.com; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://adachin-go/; } } |
goはUNIXドメインソケットで動かすようにしています。
・docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
adachin: build: . container_name: adachin networks: adachin: ipv4_address: xxx.xxx.xxx.xxx tty: true expose: - "8080" ports: - "8080:8080" volumes: - ~/git/adachin-go:/go/src/github.com/adachin-go:cached command: /root/service.sh depends_on: - db |
docker-composeでビルドします
・ps aux
1 2 3 4 5 6 7 8 9 10 |
bash-4.4# ps aux PID USER TIME COMMAND 1 root 0:00 bash /root/service.sh 12 root 0:00 realize start 13 root 0:00 nginx: master process nginx -g daemon off; 18 nginx 0:00 nginx: worker process 19 nginx 0:00 nginx: worker process 57 root 0:00 /go/bin/adachin-go 63 root 0:00 bash 69 root 0:00 ps aux |
ちゃんと立ち上がってますな!!
■まとめ
Alpineは何も入っていない!!!が!!パッケージが少ないことで脆弱性対応も少ない!!
ちなみにMysqlインストールしようとするとmariadb (10.2.15-r0)が入る。
0件のコメント