1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

devcontainerでフロントとバックの環境を構築してコンテナ開発アレルギーを克服する

Posted at

はじめに

Docker開発が苦手やねん。とにかく試行錯誤して仕事に近い感じでアレンジしながら作ってみる。アレルギーを克服しろ!
記事の量は最低限に

最低限のファイル構成

こんな感じ(モノRepositoryはベストプラクティスではない。現場がそうだってだけ)

ファイル構成
docker_world
├── .gitignore
├── frontend
│   ├── .devcontainer
│   │   ├── devcontainer.json
│   │   └── Dockerfile
│   ├── src
│   │   └── pages
│   │       └── index.tsx
│   ├── package.json
│   └── README.md
└── backend
    ├── .devcontainer
    │   ├── devcontainer.json
    │   └── Dockerfile
    ├── src
    │   ├── main.py
    │   └── requirements.txt
    └── README.md

.gitignore
frontend/node_modules/
frontend/.next/
**/__pycache__/

frontend

File - Open Folder で frontend のフォルダを開く

devcontainer.json(新規)

frontend/.devcontainer/devcontainer.json
{
  "name": "Node.js Dev Container",
  "dockerFile": "./Dockerfile",
  "postCreateCommand": "npm i"
}

Dockerfile(新規)

ENVとRUNのapt-getのとこはpythonやnextjsでもかまわずコピペでやってる

frontend/.devcontainer/Dockerfile
FROM node:latest

ENV TZ=Asia/Tokyo
RUN apt-get update && apt-get install -y \
    bash curl git openssh-client zip \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

package.json(新規)

このセットはたしかNext.jsをすっぴんセットアップしてできあがるやつだったような気がする。ご自由にどうぞ

frontend/package.json
{
  "name": "next.js",
  "version": "1.0.0",
  "description": "Your project description",
  "main": "index.js",
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start"
  },
  "dependencies": {
    "next": "13.2.4",
    "react": "18.2.0",
    "react-dom": "18.2.0"
  },
  "devDependencies": {
    "@types/node": "22.7.4",
    "@types/react": "18.3.11",
    "typescript": "5.6.2"
  }
}

devcontainerを起動

左下のへんなマークを押して Reopen in Conteiner
image.png

devcontainerを起動したときの処理の流れは

  1. devcontainer が dockerFile をビルドする
  2. 終わったら postCreateCommand を実行する
{
  "name": "Node.js Dev Container",
  "dockerFile": "./Dockerfile",
  "postCreateCommand": "npm i"
}

ハマりがちなのが、親ディレクトリに遡ることはできませんという仕様。pip installDockerfile のなかでやろうとしたときに、大概この仕様で大ハマリする

(ChatGPT)
Dockerfile内では、ビルドコンテキストが制限されており、親ディレクトリに遡ることはできません。これはセキュリティとコンテナの隔離を保つためです。具体的には、以下のような制限があります:

ビルドコンテキストの制限: Dockerfileは、指定されたビルドコンテキスト内でのみファイルをコピーしたり、アクセスしたりできます。ビルドコマンドを実行する際に指定したディレクトリ(例えば、docker build -t myapp .で.を指定した場合、そのディレクトリがビルドコンテキストになります)に制限されます。

COPYコマンドの制約: COPYやADDコマンドで親ディレクトリやそれ以外のディレクトリからファイルをコピーすることはできません。例えば、COPY ../file.txt /app/のように親ディレクトリを指定すると、エラーが発生します。

index.tsx

src/pages/index.tsx
import type { NextPage } from 'next'

const Home: NextPage = () => {
  return (
    <div>
      <h1>Hello World</h1>
    </div>
  )
}

export default Home

README.md

README.md
## サーバ起動
# npm run dev

サーバ起動

console
# npm run dev

image.png

backend

File - Open Folder で backend のフォルダを開く

devcontainer.json(新規)

backend/.devcontainer/devcontainer.json
{
  "name": "FastAPI Dev Container",
  "dockerFile": "./Dockerfile",
  "postCreateCommand": "pip install -r src/requirements.txt"
}

Dockerfile(新規)

ENVとRUNのapt-getのとこはpythonやnextjsでもかまわずコピペでやってる

backend/.devcontainer/Dockerfile
FROM python:3.12.4

ENV TZ=Asia/Tokyo
RUN apt-get update && apt-get install -y \
    bash curl git openssh-client zip \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Install pip
RUN python -m pip install --upgrade pip

requirements.txt

backend/src/requirements.txt
fastapi
uvicorn

devcontainerを起動

左下のへんなマークを押して Reopen in Conteiner
image.png

devcontainerを起動したときの処理の流れは

  1. devcontainer が dockerFile をビルドする
  2. 終わったら postCreateCommand を実行する
{
  "name": "FastAPI Dev Container",
  "dockerFile": "./Dockerfile",
  "postCreateCommand": "pip install -r src/requirements.txt"
}

ハマりがちなのが、親ディレクトリに遡ることはできませんという仕様。pip installDockerfile のなかでやろうとしたときに、大概この仕様で大ハマリする

(ChatGPT)
Dockerfile内では、ビルドコンテキストが制限されており、親ディレクトリに遡ることはできません。これはセキュリティとコンテナの隔離を保つためです。具体的には、以下のような制限があります:

ビルドコンテキストの制限: Dockerfileは、指定されたビルドコンテキスト内でのみファイルをコピーしたり、アクセスしたりできます。ビルドコマンドを実行する際に指定したディレクトリ(例えば、docker build -t myapp .で.を指定した場合、そのディレクトリがビルドコンテキストになります)に制限されます。

COPYコマンドの制約: COPYやADDコマンドで親ディレクトリやそれ以外のディレクトリからファイルをコピーすることはできません。例えば、COPY ../file.txt /app/のように親ディレクトリを指定すると、エラーが発生します。

main.py

src/main.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}

README.md

README.md
## サーバ起動
# cd src
# uvicorn main:app --host 0.0.0.0 --port 8000 --reload

サーバ起動

console
# cd src
# uvicorn main:app --host 0.0.0.0 --port 8000 --reload

image.png

1
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?