Open5
Node(typescript) + docker 環境構築メモ
必要ファイル作成 ~ 必要パッケージinstall
Dockerfile, docker-compose.yml ファイルを作成
touch Dockerfile docker-compose.yml
Dockerfile
Dockerfilet
FROM node:12-alpine3.12
WORKDIR /app
docker-compose.yml
docker-compose.yml
version: '3'
services:
node-dev:
build:
context: .
dockerfile: Dockerfile
tty: true
volumes:
- .:/app
コンテナ起動&コンテナ内で必要パッケージを追加
# コンテナ起動
docker-compose up -d --build
# コンテナ内に入る
docker-compose exec node-dev sh
# コンテナ内で必要パッケージを追加
npm init -y
npm install typescript ts-node ts-node-dev
# tsconfig.jsonファイルを作成
npx tsc --init
Dockerfile修正 ~ コード実行
mkdir src && touch src/app.ts
app.ts
console.log("Hello, world!")
package.json内のscriptを追加
package.json
{
// .....
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "npx ts-node-dev --respawn src/app.ts"
},
// ......
}
Dockerfileを修正
Dockerfile
FROM node:12-alpine3.12
WORKDIR /app
COPY package*.json ./
RUN npm install
CMD npm run dev
コンテナ環境を再起動(再ビルド)
docker-compose up -d --build
# コンテナ環境のログを確認
docker-compose logs -f
以下のように hello worldが表示されていたら成功。
node-dev_1 |
node-dev_1 | > app@1.0.0 dev /app
node-dev_1 | > npx ts-node-dev --respawn src/app.ts
node-dev_1 |
node-dev_1 | [INFO] 15:29:47 ts-node-dev ver. 1.1.8 (using ts-node ver. 9.1.1, typescript ver. 4.5.4)
node-dev_1 | Hello, world!
開発時など(コンテナ環境内でコマンドを実行したい時)
docker-compose.yml
version: '3'
services:
node-dev:
build:
context: .
dockerfile: Dockerfile
tty: true
volumes:
- .:/app
entrypoint: >
/bin/sh -c "sleep 86400"
コンテナ環境内に入って、任意のプロセスを実行
docker-compose up -d
# コンテナ環境内に入る
docker-compose exec node-dev sh
# コンテナ環境内で任意のコマンドを実行
npm run dev
以下のように Hello, world!
が表示されたら成功。
> app@1.0.0 dev /app
> npx ts-node-dev --respawn src/app.ts
[INFO] 15:35:51 ts-node-dev ver. 1.1.8 (using ts-node ver. 9.1.1, typescript ver. 4.5.4)
Hello, world!
参考資料
Expressの利用例
docker-composeファイルを修正
docker-compose.yml
version: '3'
services:
node-dev:
build:
context: .
dockerfile: Dockerfile
tty: true
volumes:
- .:/app
ports:
- 3001:3000
entrypoint: >
/bin/sh -c "sleep 86400"
app.tsを修正
src/app.ts
import express from 'express'
const app: express.Express = express()
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.use((req: express.Request, res: express.Response, next: express.NextFunction) => {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "*")
res.header("Access-Control-Allow-Headers", "*");
next();
})
app.listen(3000, () => {
console.log("Start on port 3000.")
})
type User = {
id: number
name: string
email: string
};
const users: User[] = [
{ id: 1, name: "User1", email: "user1@test.local" },
{ id: 2, name: "User2", email: "user2@test.local" },
{ id: 3, name: "User3", email: "user3@test.local" }
]
//一覧取得
app.get('/users', (req: express.Request, res: express.Response) => {
res.send(JSON.stringify(users))
})
コンテナ内で必要パッケージinstallとapiサーバー起動
docker-compose up -d
docker-compose exec node-dev sh
# コンテナ内に必要パッケージをinstall
npm install -D @types/node
npm install express
npm install -D @types/express
npm run dev
以下のように出力されていることを確認
> app@1.0.0 dev /app
> npx ts-node-dev --respawn src/app.ts
[INFO] 15:45:34 ts-node-dev ver. 1.1.8 (using ts-node ver. 9.1.1, typescript ver. 4.5.4)
Start on port 3000.
コンテナ外で、apiサーバーの疎通確認
curl -sS localhost:3001/users | jq .
以下のように結果を出力されていればOK
[
{
"id": 1,
"name": "User1",
"email": "user1@test.local"
},
{
"id": 2,
"name": "User2",
"email": "user2@test.local"
},
{
"id": 3,
"name": "User3",
"email": "user3@test.local"
}
]