docker context use

error
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
이 대화 상자 대신 JIT(Just-in-time) 디버깅을 호출하는
방법에 대한 자세한 내용은 이 메시지의 뒷부분을 참조하십시오.

************** 예외 텍스트 **************
System.Threading.Tasks.TaskCanceledException: Cancellation token triggered before we finished reading from the stream.
위치: HttpOverStream.ByLineReader.<ReadLineAsync>d__0.MoveNext()
// 생략...
************** JIT 디버깅 **************
JIT(Just In Time) 디버깅을 사용하려면 이 응용 프로그램 또는 컴퓨터의
config 파일(machine.config)의 jitDebugging 값을
system.windows.forms 섹션에 설정해야 합니다.
또한 응용 프로그램은 디버깅할 수 있도록 컴파일되어야
합니다.

예:

<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

JIT 디버깅을 사용하면 처리되지 않은 모든 예외는
이 대화 상자에서 처리되지 않고 컴퓨터에 등록된 JIT
디버거에 보내집니다.
  • 다음날 와보니 위 에러가 뜨면서 도커 실행이 안되었다
  • 생각해보니까 어제 컨텍스트 유스한 명령이 생각나서, 이 명령을 실행하기 이전으로 돌아가면 될 듯했다
terminal
1
2
3
4
5
6
7
8
# 명령어 살피기
docker context

# 컨텍스트 목록 보기
docker context list

# 기본값으로 바꾸기
docker context use default
  • 위 명령을 실행하고 다시 도커를 실행하니 잘 동작했다!

참고

react ts context

  • react에서 상위에서 하위 컴포넌트로 어떤 값을 보내 줄 때 prop으로 넘겨주게 된다
  • 이게 1, 2단계 정도면 괜찮을 텐데, 더 깊어지면 엄청 불편해진다
  • 넘기고 넘기고 넘기고 반복되는 것을 prop drilling이라고 한다
  • prop drilling으로 만들 때 긍정적인 점은 그만큼 각 컴포넌트가 느슨하게 연결되도록 만들었다는 게 아닐까..?
  • 컴포넌트가 독립성을 가지게 해주는 것도 좋지만 재사용될지 모르는 것에 너무 힘을 쓰진 말자…
  • 전역적인 state를 사용하고 싶을 때 사용할 수 있겠다
  • 리액트를 처음 배울 때 무작정 튜토리얼을 따라 하다가 redux를 배웠고,
  • 나중에 context api 만으로 충분하다는 것을 알게 되었다
  • 일단 다른 라이브러리를 설치하지 않고 충분히 가능하다는 것에 주로 사용하게 되었다
  • 사용 흐름은 redux나 context api 유사하다
  • 전역 저장소(스토어)를 생성하고, 각 컴포넌트에서는 dispatch를 통해서 상태를 업데이트할 수 있다
  • 생성, 삭제가 있다고 하면 생성 액션, 삭제 액션이 있고 dispatch 할 때 어떤 액션을 할지 정해서 업데이트를 수행한다
  • 실제 업데이트는 리듀서에서 된다. 리듀서에는 액션의 구현부?가 있다

참고 소스 코드

GlobalContext.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/* eslint-disable no-case-declarations */
import React, { createContext, Dispatch, useContext, useReducer } from 'react';
import { Comment } from '../types';

type State = Map<number, Comment>;

const initialState: State = new Map<number, Comment>();

initialState.set(0, {
id: 0,
avatar: 'https://i.pravatar.cc/48',
username: 'string',
publishedTime: '1주 전',
content: 'hello world!',
likeCount: 999,
dislikeCount: 0,
});

type CommentAction = { type: 'ADD_COMMENT'; comment: Comment };

const CommentContext = createContext<State>(initialState);
const CommentDispatch = createContext<Dispatch<CommentAction>>(() => null);

let nextId = 0;

function reducer(state: State, action: CommentAction): State {
switch (action.type) {
case 'ADD_COMMENT':
const { comment } = action;
nextId += 1;
return new Map(state).set(nextId, { ...comment, id: nextId });

default:
throw new Error('Unhandled action');
}
}

export default function GlobalContextProvider({
children,
}: {
children: React.ReactNode;
}) {
const [state, dispatch] = useReducer(reducer, initialState);

return (
<CommentContext.Provider value={state}>
<CommentDispatch.Provider value={dispatch}>
{children}
</CommentDispatch.Provider>
</CommentContext.Provider>
);
}

export function useCommentState() {
return useContext(CommentContext);
}

export function useCommentDispatch() {
return useContext(CommentDispatch);
}
  • 컨텍스트를 만들고
index.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import GlobalContextProvider from './context/GlobalContext';

ReactDOM.render(
<React.StrictMode>
<GlobalContextProvider>
<App />
</GlobalContextProvider>
</React.StrictMode>,
document.getElementById('root')
);
  • index.tsx에서 App을 감싸든 어디든 같은 컨텍스트로 묶어줄 상위 컴포넌트를 감싸준다
App.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function App() {
const comment = useCommentState();

return (
<Main>
<Header />

<div className="contents">
{Array.from(comment).map(([id, data]) => {
return (
<div className="commentThread" key={id}>
<Comment data={data} />
</div>
);
})}
</div>
</Main>
);
}
  • 참조하여 사용할 때는 이렇게
Header.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Header() {
const commentDispatch = useCommentDispatch();

// ...

const onSubmitHandler = () => {
commentDispatch({
type: 'ADD_COMMENT',
comment,
});
};

// ...
}
  • 상태를 업데이트하고 싶으면 이런 식으로 할 수 있겠다

참고 소스 코드 저장소

참고