#はじめに
コードを変更しても、コンテナ内のアプリの挙動が変わらなくて、困ったことになっていました。その対処法についてのメモです。(キャッシュが効いていた系ではない)
#先に対処法
Dockerfile
内でbuildしたapp
(実行ファイル)を、docker-compose.yml
で設定していたvolumesのローカルディレクトリ内にあったapp
が上書きしてました。
よって、余計なマウントをしないように変更することで解決しました。
#Problem
- dockerコンテナで作成していたgolangのアプリがある
-
Dockerfile
内でbuidしてappを起動するようにしている - 例えば、
main.go
を編集して保存する。 -
docker-compose up -d --build
でアプリを再作成・起動する - あれ?変更されてないぞ!?(buildは実行されている)
-
docker-compose build --no-cache
を試すが同じ...
ディレクトリ構成↓
myapp
- docker-compose.yml
- Go
- Dockerfile
- main.go
- app
コード一部抜粋↓
FROM golang:1.12.12-alpine3.9 AS build
ENV GOPATH $GOPATH:/go
ENV PATH $PATH:$GOPATH/bin
ENV GO111MODULE=on
hogehoge
COPY . /go/src/app
WORKDIR /go/src/app
RUN go build -o app main.go
CMD ["./app"]
version: '2'
services:
app:
build:
context: ./Go
dockerfile: Dockerfile
volumes:
- "./Go:/go/src/app"
container_name: go_app
ports:
- "127.0.0.1:8080:8080"
tty: true
restart: always
#原因
原因は、試しに作成していたローカルのappでした。
コマンドの実行順序は、RUN → volumes → CMD
となっており、コンテナ内でbuildしたapp
をローカルのapp
で上書きしてしまっていました。
#対処法
##余計なファイルをマウントしない
今回であれば、セッション情報のみを永続化して保存する必要があったので、ファイルの共有はこの1ファイルで十分でした。
volumes:
- "./Go/sessions:/go/src/app/sessions"
##共有してはいけないファイルを除外する
開発時には、ソースコードをマウントして編集するほうが便利です。
よって、app
だけは共有しないようにするのも一つの手だと思いました。
(DockerでVolumeをマウントするとき一部を除外する方法)
#おわりに
そもそも、セッション情報の永続化を目的としてコード変更をゴニョゴニョやってるうちに、こんなことに。(本番サーバと開発サーバでの差分もあったり)
そのうち、データベース管理に移行します。(そのうち)