LoginSignup
0
0

More than 3 years have passed since last update.

docker containerの挙動が変わらなくて困った

Posted at

はじめに

コードを変更しても、コンテナ内のアプリの挙動が変わらなくて、困ったことになっていました。その対処法についてのメモです。(キャッシュが効いていた系ではない)

先に対処法

Dockerfile内でbuildしたapp(実行ファイル)を、docker-compose.ymlで設定していたvolumesのローカルディレクトリ内にあったappが上書きしてました。
よって、余計なマウントをしないように変更することで解決しました。

Problem

  1. dockerコンテナで作成していたgolangのアプリがある
  2. Dockerfile内でbuidしてappを起動するようにしている
  3. 例えば、main.goを編集して保存する。
  4. docker-compose up -d --build でアプリを再作成・起動する
  5. あれ?変更されてないぞ!?(buildは実行されている)
  6. docker-compose build --no-cache を試すが同じ...

ディレクトリ構成↓

myapp
 - docker-compose.yml
 - Go
    - Dockerfile
    - main.go
    - app

コード一部抜粋↓

Dockerfile
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"]
docker-compose.yml
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ファイルで十分でした。

docker-compose.yml
    volumes:
      - "./Go/sessions:/go/src/app/sessions"

共有してはいけないファイルを除外する

開発時には、ソースコードをマウントして編集するほうが便利です。
よって、appだけは共有しないようにするのも一つの手だと思いました。
DockerでVolumeをマウントするとき一部を除外する方法

おわりに

そもそも、セッション情報の永続化を目的としてコード変更をゴニョゴニョやってるうちに、こんなことに。(本番サーバと開発サーバでの差分もあったり)
そのうち、データベース管理に移行します。(そのうち)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0