docker 开发环境中的 Phoenix - 生成的代码无法从 VSCode 保存

问题描述 投票:0回答:1

我是 phoenix 的新手,正在尝试在 WSL 上使用 Docker 设置一个项目。我已经运行了该项目,并且可以很好地进行更改。使用 Phoenix 生成器之一时会出现此问题,每当我尝试编辑生成的文件时,我都无权保存它,因为它是从容器内部创建的。

我以前使用过 Docker,但主要是针对 PHP。我知道我需要创建一个与我的主机用户匹配的用户。但是,当我尝试此操作时,我收到错误,表明 mix 无权读取某些文件,例如从 _build 目录读取。我是新人,可能完全错过了一些东西。这是我的基本 Dockerfile docker-compose.yml 和 entrypoint.sh,没有创建用户:

Dockerfile:

FROM hexpm/elixir:1.16.2-erlang-26.2.2-alpine-3.19.1    

RUN apk add --no-cache git 

RUN mkdir /app
COPY . /app
WORKDIR /app

RUN mix local.hex --force
RUN mix deps.get && mix deps.compile

CMD /app/entrypoint.sh

docker-compose.yml:


services:
  phoenix:
    build:
      context: .
    volumes:
      - ./:/app
    environment:
      DB_USER: user
      DB_PASSWORD: secret
      DB_DATABASE: vrn
      DB_PORT: 3306
      DB_HOST: db
    ports:
      - 4000:4000
    depends_on:
      - db
  db:
    image: mysql:8.3
    environment:
      MYSQL_ROOT_PASSWORD: rootsecret
      MYSQL_DATABASE: vrn
      MYSQL_USER: user
      MYSQL_PASSWORD: secret
    restart: always
    volumes:
      - mysql:/var/lib/mysql
volumes:
  mysql:

入口点.sh:

mix ecto.create
mix ecto.migrate
mix phx.server

我尝试在 Dockerfile 的开头创建一个用户和组来匹配我的主机用户,但我对它有点陌生,可能完全搞砸了。

docker docker-compose dockerfile elixir phoenix-framework
1个回答
0
投票

问题是

docker
默认情况下与
root
用户一起运行,无论您是否使用 docker
 编译和/或保存文件 
,它们都是从
root
用户写入的,使它们对本地用户来说是只读的.

一旦您已经拥有

root
用户编写的一些文件,它们对于本地用户来说是只读的,即使对于
docker
的本地用户也是如此。

也就是说,您要将所有内容回滚为本地用户所拥有,如下

sudo chown -R `id -u`:`id -g` . 

这将使本地文件夹中的所有文件归本地用户所有。

然后使用您本地可用的凭据创建文件。

echo "$(whoami):x:$(id -u):$(id -g)::/opt/source:/bin/sh" > /tmp/docker_passwd && \
  echo "$(whoami):x:$(id -g):" > /tmp/docker_group

然后(可选)在

docker compose

中提供您的本地 UID
MY_UID="$(id -u)" MY_GID="$(id -g)" \
  docker-compose up --build ...

然后您需要修改您的

docker
文件以添加卷。

volumes:
  - /tmp/docker_passwd:/etc/passwd:ro
  - /tmp/docker_group:/etc/group:ro

最后,以用户身份启动 docker。

docker exec --user "$(id -u)":"$(id -g)" -it
© www.soinside.com 2019 - 2024. All rights reserved.