🐥

go言語の開発用コンテナ

に公開

はじめに

  • go言語開発用のコンテナです
  • sshd も入れて、vscode から直接接続する
  • git もコンテナ内に入り込んだ状態でする
  • コンテナの起動停止は compose でする
  • ssh-key は手動て作成した
  • wsl のフォルダとつないでないので、ssh-key を再作成することもあるけどまぁいい

コンテナ

Dockerfile

  • 作業用ユーザは useradd しておいた
  • ssh-key はとりあえず自力で作って github に都度追加した
FROM golang:1.24-bookworm

RUN echo 'export PATH="/usr/local/go/bin:${PATH}"' > /etc/profile.d/go_path.sh

RUN apt-get update \
&&  apt-get install -y --no-install-recommends \
    sudo \
    openssh-server \
&&  apt-get clean \
&&  rm -rf /var/lib/apt/lists/*

RUN mkdir -p /run/sshd && ssh-keygen -A

RUN useradd -m -s /bin/bash yukip \
&&  usermod -aG sudo yukip \
&&  echo "yukip ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

RUN su - yukip -c 'mkdir /home/yukip/.ssh'

COPY --chown=yukip:yukip authorized_keys /home/yukip/.ssh/

RUN chmod 700 /home/yukip/.ssh \
&&  chmod 600 /home/yukip/.ssh/authorized_keys

COPY --chown=yukip:yukip yukip.bashrc /home/yukip/

RUN echo "source ~/yukip.bashrc" >> /home/yukip/.bashrc

RUN su - yukip -c 'git config --global user.name "yukip"' \
&&  su - yukip -c 'git config --global user.email "yukip@chottodake.dev"'

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D", "-e"]

compose.yaml

  • docker run でもいいんだけど、ポートの指定とかホスト名とかあるので compose にしておいた
services:
  ssh:
    image: con01
    build: .
    container_name: con01
    hostname: con01
    ports:
      - "2221:22"

go アプリ

  • 上で作ったコンテナに vscode の remote-ssh で入り込んでから作業する
  • gcp の gce で開発するときとおんなじ感じで作業できる感じ
  • リポジトリは非公開だけど内容はこれ
  • go言語の拡張機能と dlv は vscode の画面で自分で追加する
  • go で作った web アプリ用のポートは開かなくても vscode が通してくれるみたい
  • vscode でデバッグできた

go.mod

module github.com/free-chottodake-dev/go06

go 1.24.5

main.go

package main

import (
	"fmt"
	"log"
	"net/http"
)

func handleFunc(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "ok")
	log.Print("handleFunc")
}

func main() {
	log.SetFlags(log.LstdFlags | log.Lshortfile)
	log.Print("start")

	http.HandleFunc("/", handleFunc)

	log.Print("http://localhost:8080 ...")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Print(err)
		return
	}
}

vscode launch.json

{
    "version": "0.2.0",
    "configurations": [

        {
            "name": "Launch Package",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}"
        }
    ]
}

Discussion