takoizmi22
@takoizmi22

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

sql-migrateをコンテナにインストールできない

解決したいこと

ここに解決したい内容を記載してください。

例)
sql-migrationのインストールエラー、コマンド実行ができません。

以下の記事に準拠して進めた。
https://qiita.com/rin1208/items/56fde6355127761c0c6b

M1Macを使用しているためdocker-compose.yamlは以下のようにした。

version: '3.7'
services:
  api:
    build: .
    ports:
      - "8080:8080"
    tty: true
    volumes:
      - ./:/migrations
    working_dir: /migrations
    environment:
      - MYSQL_USER=${USERNAME}
      - MYSQL_PASSWORD=${USERPASS}
      - MYSQL_HOST=${HOSTNAME}
      - MYSQL_PORT=${PORTNUMBER}
      - MYSQL_DATABASE=${DATABASENAME}
  
  mysql:
    image: mysql:5.7
    platform: linux/x86_64
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${ROOTPASS}
      - MYSQL_DATABASE=${DATABASENAME}
    command: >
      
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --innodb_file_per_table
      --innodb_file_format=BARRACUDA
      --innodb_large_prefix=1
      --innodb_use_native_aio=0

  phpmyadmin:
    platform: linux/x86_64
    image: phpmyadmin
    ports:
      - 8000:80
    environment:
      - PMA_HOST=${PHOSTNAME}
      - PMA_PASSWORD=${PPASS}
      - PMA_USER=${PUSERNAME}
      - PMA_ARBITRAY=${PARBITRAY}

インストールされているGoのバージョンに合わせてDockerfileを記述した。

FROM golang:1.20

RUN go install github.com/rubenv/sql-migrate/...@latest

For Go version from 1.18, use:
go install github.com/rubenv/sql-migrate/...@latest

マイグレーションファイルを以下のように変更した

-- +migrate Up
CREATE TABLE IF NOT EXISTS PopTbl
(pref_name VARCHAR(32) PRIMARY KEY,
 population INTEGER NOT NULL);

INSERT INTO PopTbl VALUES('徳島', 100);
INSERT INTO PopTbl VALUES('香川', 200);
INSERT INTO PopTbl VALUES('愛媛', 150);
INSERT INTO PopTbl VALUES('高知', 200);
INSERT INTO PopTbl VALUES('福岡', 300);
INSERT INTO PopTbl VALUES('佐賀', 100);
INSERT INTO PopTbl VALUES('長崎', 200);
INSERT INTO PopTbl VALUES('東京', 400);
INSERT INTO PopTbl VALUES('群馬', 50);

-- +migrate Down
DROP TABLE IF EXISTS PopTbl;

発生している問題・エラー

参考にした記事、最後のコマンド入力が通らず以下のようなエラーになる。

docker-compose exec api bash -c "sql-migrate up"   

bash: sql-migrate: command not found

自分で試したこと

問題の切り分け

・MySQLは起動しているかどうか
・phpmyadminは起動しているかどうか
→MySQLは直接確認していないが、phpmyadminは立ち上がっていて、指定したテーブルの項目ができている。
→services:apiの問題

docker-compose exec api bash 

でコンテナに手動で入り、sql-migrationをインストールしようと試みたが、パッケージが見つからないと弾かれた。

go install github.com/rubenv/sql-migrate/...@latest
warning: "github.com/rubenv/sql-migrate/...@latest" matched no packages
go version
go version go1.2.2 linux/amd64

go get -v github.com/rubenv/sql-migrate/...
(インストール失敗)

コンテナ環境のGoのversionが、Dockerfileで指定していたはずの1.20ではなく1.2となっていた。
キャッシュを消去してコンテナを再起動させてみた。

docker-compose build --no-cache
docker-compose down
docker-compose up
(sql-migrateのインストールには成功)
docker-compose exec api bash -c "sql-migrate up"
(しかしmigrationには失敗する)
Applied 0 migrations
0

1Answer

closeですが、未回答なので、一言

services:
  api:
  depends_on:
    - mysql    先行指定します。
  ...
  volumes:
      - /フルパスで:/migrations
  working_dir: /migrations
  environment:
    - PATH....他のアプリのパスの通します
  command: sql-migrate up

最初は command: bash にしてpath,cdが適切か?sql-migrate upが実行できるか?確認しましょう。

docker-compose down
docker-compose up -d

アップはディタッチしましょう。sql-migrate upはフォアグラウンド実行でないようですが、フォアグラウンド実行可能でしょうか?

docker-cli-composeをインストールすると、docker compose の各種確認コマンドが使え便利ですよ! また、docker-compose だとimageの残骸が残るので管理が大変です。

0Like

Comments

  1. @takoizmi22

    Questioner

    ありがとうございます!
    goのインストールがうまくいってなかったのはキャッシュから引っ張ってきたらしくdockerと不整合を起こしていたことが原因でした。

Your answer might help someone💌