我是 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
默认情况下与 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